Javascript jQuery text() 和换行符
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4535888/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
jQuery text() and newlines
提问by Joe Armstrong
I want to be able to say
我想说
$(someElem).text('this\n has\n newlines);
and it renders with newlines in the browser. The only workaround I have found is to set the css property 'white-space' to 'pre' on someElem. This almost works, but then I have an annoyingly large padding between the text and the top of someElem, even when I set padding to 0. Is there a way to get rid of this?
它在浏览器中用换行符呈现。我发现的唯一解决方法是在 someElem 上将 css 属性“white-space”设置为“pre”。这几乎可以工作,但是我在文本和 someElem 顶部之间有一个令人讨厌的大填充,即使我将填充设置为 0。有没有办法摆脱这个?
回答by cleong
It's the year 2015. The correct answer to this question at this point is to use CSS white-space: pre-line
or white-space: pre-wrap
. Clean and elegant. The lowest version of IE that supports the pair is 8.
现在是 2015 年。此时此问题的正确答案是使用 CSSwhite-space: pre-line
或white-space: pre-wrap
. 干净优雅。支持该对的 IE 的最低版本是 8。
https://css-tricks.com/almanac/properties/w/whitespace/
https://css-tricks.com/almanac/properties/w/whitespace/
P.S. Until CSS3 become commonyou'd probably need to manually trim off initial and/or trailing white-spaces.
PS在 CSS3 变得普遍之前,您可能需要手动修剪初始和/或尾随空格。
回答by José Roberto Araújo Júnior
If you store the jQuery object in a variable you can do this:
如果将 jQuery 对象存储在变量中,则可以执行以下操作:
var obj = $("#example").text('this\n has\n newlines');
obj.html(obj.html().replace(/\n/g,'<br/>'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="example"></p>
If you prefer, you can also create a function to do this with a simple call, just like jQuery.text() does:
如果您愿意,您还可以创建一个函数来通过简单的调用来执行此操作,就像 jQuery.text() 所做的那样:
$.fn.multiline = function(text){
this.text(text);
this.html(this.html().replace(/\n/g,'<br/>'));
return this;
}
// Now you can do this:
$("#example").multiline('this\n has\n newlines');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="example"></p>
回答by Peter V. M?rch
Here is what I use:
这是我使用的:
function htmlForTextWithEmbeddedNewlines(text) {
var htmls = [];
var lines = text.split(/\n/);
// The temporary <div/> is to perform HTML entity encoding reliably.
//
// document.createElement() is *much* faster than jQuery('<div></div>')
// http://stackoverflow.com/questions/268490/
//
// You don't need jQuery but then you need to struggle with browser
// differences in innerText/textContent yourself
var tmpDiv = jQuery(document.createElement('div'));
for (var i = 0 ; i < lines.length ; i++) {
htmls.push(tmpDiv.text(lines[i]).html());
}
return htmls.join("<br>");
}
jQuery('#div').html(htmlForTextWithEmbeddedNewlines("hello\nworld"));
回答by karim79
Alternatively, try using .html
and then wrapwith <pre>
tags:
或者,尝试使用.html
然后用标签包装<pre>
:
$(someElem).html('this\n has\n newlines').wrap('<pre />');
回答by Mark Byers
回答by JochenJung
I would suggest to work with the someElem
element directly, as replacements with .html()
would replace other HTML tags within the string as well.
我建议someElem
直接使用该元素,因为替换 with.html()
也会替换字符串中的其他 HTML 标记。
Here is my function:
这是我的功能:
function nl2br(el) {
var lines = $(el).text().split(/\n/);
$(el).empty();
for (var i = 0 ; i < lines.length ; i++) {
if (i > 0) $(el).append('<br>');
$(el).append(document.createTextNode(lines[i]));
}
return el;
}
Call it by:
通过以下方式调用它:
someElem = nl2br(someElem);
回答by daCoda
Try this:
尝试这个:
$(someElem).html('this<br> has<br> newlines);
回答by Andrew B.
Using the CSS white-space property is probably the best solution. Use Firebug or Chrome Developer Tools to identify the source of the extra padding you were seeing.
使用 CSS white-space 属性可能是最好的解决方案。使用 Firebug 或 Chrome 开发人员工具来确定您看到的额外填充的来源。