当前位置: 首页 > Web前端 > HTML

一个项目需求引起的——textarea中的换行和空格

时间:2023-04-02 12:40:10 HTML

我们在前台使用textarea编辑文本,用js提交到后台时,空格和换行是我们最需要考虑的问题。在文本区域中,空格和换行符将保存为/s和/n。如果前台输入和显示的文本都在textarea中,则不需要做任何处理。你在textarea中书写的样式会按照你之前编辑的样式正确显示。所以如果需要textarea来编辑提交文本,从后台返回后,没有显示在textarea中,这时就需要考虑处理空格和换行了。其实之前接触的时候完全没有考虑这些问题,也是因为最近的一个项目中有这样一个需求,需要用户在textarea中输入文字,然后显示在提交后以文章的格式页面。不管用户输入多少空格,每段文字默认只缩进2个字符,还要考虑用户上传的诗歌形式,即每段之间可能有两行空格。总而言之,一句话总结就是——去掉用户输入的空格,保留段落之间的换行符。那么我最后的做法是,保存的时候不做任何处理,直接保存到后台。显示时,从后台获取文本后,去掉文本中的所有空格,然后在

标签中显示。这里我用一个小例子来说明textarea在各种情况下的保存和显示。首先,创建一个简单的html页面。为了方便数据的获取和展示,我引入vue来处理数据,给提交按钮绑定一个点击事件。点击确定后,会在下方显示。基本页面结构和js如下:

请输入内容:

显示内容:

//js部分constvm=newVue({el:'#app',data:{text1:'',text2:''},methods:{submitText(){this.text2=this.text1;}}})无需处理空格和换行,在textarea中显示非常简单。点击提交就可以看到效果了,如下图。不做任何处理,保留所有空格和换行符,适合保存和编辑。不处理空格和换行在div中显示将刚才的第二个textarea换成div,效果如下图。可以看出,空格和换行符都没有处理,直接忽略。

请输入内容:

提交

显示内容:

{{text2}}

不处理空格和换行,显示在pre标签将div替换为pre标签,提交的文本显示在pre标签中。pre元素定义预先格式化的文本。包含在pre元素中的文本通常保留空格和换行符。它更常见的应用是显示代码。在技??术网站和博客的页面中,前置标签用于包裹代码块。从下图的效果可以看出,pre标签还可以完整保留用户输入的空格和换行符,貌似可以满足我的基本需求。那么接下来的问题就是如何去掉空格,实现2个字符的自动缩进。

请输入内容:

提交

显示的内容:

{{text2}}
然后我尝试直接设置css属性为前置标签text-index:2em;?这样能满足要求吗?答案显然是否定的,因为这个属性规定了块级元素第一行文本的缩进,而从头到尾只有一个块级元素pre,这显然是不可能的。我们必须考虑到用户自己输入的空格。替换空格和保留换行既然直接显示不行,看来还是要对文字进行处理,那就处理一下吧。首先尝试,去掉所有空格,首先想到的是trim()方法。思路是将每段文本以换行符作为分割,然后使用trim()方法去掉文本前后的空格,将每段文本用

标签包裹起来,将每段拼接起来用
换行标签站起来。同时不使用pre标签显示文本,直接将处理后的html片段插入到div标签中。这里用到了vue的v-html属性。

请输入内容:

提交

显示内容:

//js部分submitText(){letarr=[];this.text1.split('\n').forEach(item=>arr.push(`

${item.trim()}

`));this.text2=arr.join('
');}如下图,基本实现了自动缩进和换行。接下来我们输入一段诗歌,添加一些样式,看看最终效果如何:再输入一段文章,输入时打乱文章的缩进。可以看到无论我们怎么缩进,显示效果都是缩进两个字符,满足要求!