By HTML 4.0 appendix B chapter 3.1, “a line break immediately following a start tag must be ignored, as must a line break immediately before an end tag. This applies to all HTML elements without exception.”
其实,按标准来说,开始标签后紧跟的一个换行,结束标签之前紧跟的一个换行,都应该忽略掉。
如: <p> aaa </p> 和<p>aaa</p>的效果应该一样。
但对于<textarea>似乎处理的不一样,起码IE6是不一样的。 如: <textarea> 第一行字 第二行字 </textarea>
文本框中应该只有两行字而已,而事实呢, 开始标签之后的换行被忽略了,结束标签之前的换行没有忽略。
找到一个js脚本,可以将二者都忽略,可能不好使,借鉴一下思想吧……
window.addEventListener("load", function() { var enabled = true; if ( enabled ) { var textarea = document.getElementsByTagName("textarea"); for (var i = 0; i < textarea.length; i++) { if (textarea[i].value != textarea[i].innerHTML) { continue; } var temp = escape(textarea[i].outerHTML); var dos = false; var mac = false; if (temp.indexOf("%3E%0D%0A") != -1) { temp = temp.replace(/%3E%0D%0A/,"%3E"); dos = true; } if (temp.indexOf("%0D%0A%3C") != -1) { temp = temp.replace(/%0D%0A%3C/,"%3C"); dos = true; } if (temp.indexOf("%0D%3C") != -1 && !dos) { temp = temp.replace(/%0D%3C/,"%3C"); mac = true; } if (temp.indexOf("%0A%3C") != -1 && !dos && !mac) { temp = temp.replace(/%0A%3C/,"%3C"); } textarea[i].outerHTML = unescape(temp); } } }, false);
=============================================================== 而我们面对的情况是: 用户可能先敲一个回车,然后输入,然后存入DB,再次读出,写入<textarea>时, 该死的<h:inputTextArea>标签,是把值紧跟<textarea>标签输出的, 所以,回车被忽略了!!没了!!!
后台的话,可以在字符串前面加一个\n,但是,这点小事就要该后台,不爽。 本想借鉴一下上面的js,但是,郁闷的是,对于
<textarea rows="5" cols="50"> 12 34 </textarea>
它的textarea[i].innerHTML返回值是:
<textarea rows="5" cols="50">12 34 </textarea>
“12”之前是没有换行的,它被完全忽略了。 本来多加一个换行就行了,现在得加两个,才能显示为一个。 但,如果本来12之前就没换行,加两个,又多了一个。 怎么办?
还有,value是包括最后的换行的,innerHTML则不包括。
|