jQuery text() 和换行符

IT技术 javascript jquery html
2021-01-23 23:02:59

我想说

$(someElem).text('this\n has\n newlines);

它在浏览器中用换行符呈现。我发现的唯一解决方法是在 someElem 上将 css 属性“white-space”设置为“pre”。这几乎有效,但随后我在文本和 someElem 顶部之间有一个令人讨厌的大填充,即使我将填充设置为 0。有没有办法摆脱这个?

6个回答

现在是 2015 年。此时此问题的正确答案是使用 CSSwhite-space: pre-linewhite-space: pre-wrap. 干净优雅。支持该对的 IE 的最低版本是 8。

https://css-tricks.com/almanac/properties/w/whitespace/

PS在 CSS3 变得普遍之前,您可能需要手动修剪初始和/或尾随空格。

在 2017 年发现这个:仍然相关,仍然是问题的答案。
2021-03-14 23:02:59
这个帖子有一个错误。这一年是 2017 年,而不是 2015 年。其他一切看起来都准确无误。
2021-03-22 23:02:59
这就是答案。应该更高。欢迎来到 2016 年。
2021-03-31 23:02:59
这应该是答案。
2021-04-04 23:02:59
2020 年发现的,仍然相关
2021-04-06 23:02:59

如果将 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>

如果您愿意,您还可以创建一个函数来通过简单的调用来执行此操作,就像 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>

这实际上回答了 OP 问题
2021-03-22 23:02:59
最好的一个,像魅力一样工作并解决了这个问题。
2021-04-04 23:02:59
第一个代码片段的第二行缺少右括号。
2021-04-11 23:02:59

这是我使用的:

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"));
事实上,它优于 Mark 的建议,因为它不存在 XSS 攻击的风险。
2021-03-19 23:02:59
我认为您可以从函数中创建 div(即:document.createElement('div'))并将其用于所有调用,对吗?
2021-03-21 23:02:59
我相信@cleong 的回答是最好的解决方案
2021-03-24 23:02:59
如果您的文本中有明确的换行符,那么您可能希望使用text.split(/\\n/), 甚至text.split(/\\\\n|\\n|\n/). 我在使用\n在字符串中嵌入文字控制字符的 API 以 JSON 格式传递文本时遇到了这个问题
2021-03-24 23:02:59
@FabioZadrozny:是的,你说得对!我已经(几乎)相应地编辑了答案。div 是在函数内部创建的,但现在在循环外部。它可能完全在函数之外,但使用起来会很麻烦。
2021-03-26 23:02:59

或者,尝试使用.html然后标签包装<pre>

$(someElem).html('this\n has\n newlines').wrap('<pre />');
这就是我所用的,我使用的是 .text 而不是 .html
2021-03-27 23:02:59

您可以使用 html代替text和替换每次出现的\nwith <br>不过,您必须正确转义您的文本。

x = x.replace(/&/g, '&amp;')
     .replace(/>/g, '&gt;')
     .replace(/</g, '&lt;')
     .replace(/\n/g, '<br>');
一些阅读此答案的人可能不知道这有多危险。切勿将此解决方案与用户提供的文本一起使用。Peter Mørch 的解决方案更可取。
2021-04-01 23:02:59
@kulebyashik Peter 的解决方案使用,text而此答案html直接使用
2021-04-04 23:02:59