用于在网页上显示源自<text区域>
Pattern for displaying text on a web page that originated from a <textarea>
问题
在保留原始格式的同时,在源自<textarea>
元素的网页上显示文本的简单有效模式是什么?
目标
目标是允许客户端在<textarea>
中键入任何感觉,并使他们能够在以后查看它,同时保留他们使用的所有字符和换行符。
任何使用Javascript、Jquery或Backbone的东西都会很棒。
更多信息
到目前为止,我尝试过的三种(有缺陷的)方法:
- 使用
jQuery('element').html()
显示文本- 这种方法的问题是,客户端可能选择在文本区域中键入的html相关字符被解释为html,例如
>
和<
- 这种方法的问题是,客户端可能选择在文本区域中键入的html相关字符被解释为html,例如
- 使用
jQuery('element').text()
显示文本- 此方法的问题在于,客户端选择使用的所有换行符都将被丢弃
- 显示只读
<textarea>
元素中的文本。- 这种方法的问题是很难使
<textarea>
扩展到文本的确切大小。在吸引人的格式方面,它也留下了一些不足之处
- 这种方法的问题是很难使
str.replace(/'x26/g,''x26amp;') // first do all & to &
.replace(/'x3c/g,''x26lt;') // next do < to <
.replace(/'r'n|'n/g,''x3cbr>'); // finally replace new lines with <br>
// Note: I chose hex char code to exclude the 'risky' characters from the code,
// that way they are also safe for inline-scripts (in older browsers).
// Also, I used local setting char-notation, not unicode,
// as they are the same for this purpose (and it saves some chars).
- 注意:更换顺序很重要
- 另请注意:这个序列并没有结束,试图通过找到一个"相当于 …它确实坏了;"(并将空格替换为)因为使用
pre
标记来保存内容要简单得多(对于较旧的浏览器,尤其是IE<9)或禁用CSS:div.preview {white-space: [pre|pre-wrap];}
中的空白折叠功能
简单的例子(在这里直播jsFiddle):
<textarea style="width:98%" onkeyup="
this.nextSibling.innerHTML=this.value.replace(/'x26/g,''x26amp;')
.replace(/'x3c/g,''x26lt;')
.replace(/'r'n|'n/g,''x3cbr>');
"></textarea><pre></pre>
注意,您可能还希望挂接onchange
等。此外,您可能希望有一个单独的函数并缓存输出(和输入)元素。
你可以让这变得更加困难,例如,只在绝对需要的时候更换&
,<
也是如此
此外,您还可以将所有不需要的(非'ASCII')字符转换为其等效的unicode HTML实体,但对于简单的预览来说,所有这些似乎都有点过头了,因为您可能不想在这个(过于有效的)HTML标记中提交用户的数据。一个简单的例子是:
.replace(/[^'u0020-'u007e]/g, function(m){return ''x26#'+m.charCodeAt(0)+';';})
希望这能让你开始。
编辑1:还可以看看演示jsFiddle v2和演示jsFiidle v3,了解一些更高级的示例,如:
( // START HTML encoder hookup
function(enc, e1, e2, e3){
(e1.onkeyup = function(){
e3.innerHTML = e2.value = enc(e1.value);
})();
}( // IIFE Passing encoder and elements
(function(){ //HTML enc
var amp=/'x26/g , lte=/'x3c/g , eol=/'r'n|'n/g
, noASCI=/[^'u0020-'u007e]/g
, toUCPd=function(m){ return ''x26#'+ m.charCodeAt(0) +';'; }
;
return function(s){return(
s.replace(amp, ''x26amp;')
.replace(lte, ''x26lt;')
.replace(eol, ''x3cbr>')
.replace(noASCI, toUCPd) //optional
);};
}
)() //IIFE returns HTML enc
, document.getElementsByTagName('textarea')[0]
, document.getElementsByTagName('textarea')[1]
, document.getElementsByTagName('pre')[0]
)
); // END HTML encoder hookup
/* Corresponding demo html:
Input:<br>
<textarea>	<this is a tab char & these ☺ë non-'ASCII'
continue to to type here</textarea><br>
Generated HTML code:<br>
<textarea>code output</textarea><br>
HTML output in pre:<br>
<pre>html output</pre>
*/
编辑2:几乎忘记了,您可以查看(古怪、忘记但仍然有效)xmp
标记。这将一直工作到用户键入</xmp
为止。对于旧IE,请注意:替换整个xmp元素,而不是设置/覆盖它的innerHTML
(因为这至少在IE6中不起作用)。然而,如前所述,这个xmp
标签在不同的浏览器上有很多关于框布局、溢出等的怪癖!
相关文章:
- <text区域>在我的html中包含event.keycode==13之后,wrap就不起作用了
- 在node.jsexpress应用程序中,req.body没有得到<text区域>价值
- 更改<pre>在文本区域更新时阻止内容
- Don't在设置<text区域>
- Tinymce删除<html>在文本区域中输出时标记
- 将文本插入<text区域>
- 多重<text区域>具有字符计数器+行限制器的字段
- 只要区域不是<a>标签
- 如何获得<text区域>使用jQuery动态获取值
- Href和onclick事件在<区域>
- 正在获取<text区域>jQuery的值未按预期工作
- 防止<text区域>避免失去焦点以保持移动键盘
- 是否可以在`<text区域>`
- 如何在多行<text区域>
- <text区域>字符限制
- 如何实现<块引号>并且<代码>在文本区域
- 正在恢复<text区域>重新加载页面上的滚动条位置
- 在<text区域>使用JavaScript
- AngularJS-动态创建<text区域>使用ngSanitize不会't显示(其他元素显示)
- 如何添加<text区域>使用jquery的before按钮