jQuery text()と改行


114

言えるようになりたい

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

そしてそれはブラウザの改行でレンダリングします。私が見つけた唯一の回避策は、csEプロパティ 'white-space'をsomeElemで 'pre'に設定することです。これはほとんど機能しますが、パディングを0に設定しても、テキストとsomeElemの上部との間にうっとうしいほど大きなパディングがあります。これを取り除く方法はありますか?


2
<pre>タグでラップする(そして.text()の代わりに.html()を使用する)は、私の意見では、テキストファイルまたはプレーンテキストからの改行を維持するための最も簡単で最良のソリューションです(これは、以下のKarimの回答で示唆されています)。しかし、これに対するより新しい代替white-space: pre-wrap;案は、クレオンの回答で提案されているように使用することです
edwardtyl

1
append()代わりにtest()<br/>代わりに使用しないのはなぜ\nですか?このように$(someElem).append("this <br/> has <br/> newlines");
Erfan Ahmed

回答:


132

それは2015年です。この時点でこの質問に対する正しい答えは、CSS white-space: pre-lineまたはを使用することwhite-space: pre-wrapです。クリーンでエレガント。ペアをサポートするIEの最低バージョンは8です。

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

PS CSS3が一般的になるまでは、おそらく手動で初期および/または末尾の空白を削除する必要があります。


3
これが答えです。
Axel

3
これが答えです。もっと高いべき。2016
。– neoRiley

3
これは2017年に見つかりました:まだ関連性があり、それでも質問への答えです。
Troy Harris

6
この投稿にエラーがあります。年は2015年ではなく2017年です。それ以外はすべて正確に見えます。
JDBはモニカを2017

1
new Date("2016");
Brandito 2018

60

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>


最初のコードスニペットの2行目に閉じ括弧がありません。
Mahmoud Fayez 2013年

1
これは実際にOPの質問に答えます
トミー

最高のものは、魅力のように働き、問題を解決しました。
ZEESHAN ARSHAD

37

これが私が使うものです:

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"));

1
実際、XSS攻撃のリスクがないため、Markの提案よりも優れています。
Andrew B.

関数からdiv(つまり、document.createElement( 'div'))を作成し、それをすべての呼び出しに使用できますか?
Fabio Zadrozny

@FabioZadrozny:はい、そうです!私はそれに応じて(ほぼ)回答を編集しました。divは関数内で作成されますが、ループの外側で作成されます。それは完全に関数の外にある可能性がありますが、使用するのは面倒になります。
PeterV.Mørch12年

1
私は@cleongの答えがこれに対する最良の解決策であると信じています
minillinim

テキストに明示的な改行文字がある場合はtext.split(/\\n/)、またはを使用して分割することができますtext.split(/\\\\n|\\n|\n/)\n文字列にリテラル制御文字を埋め込むAPIを使用してJSON形式のテキストを渡すときにこれに遭遇しました。
D. Visser 2016年

20

また、使用してみ.htmlた後、ラップ<pre>タグ:

$(someElem).html('this\n has\n newlines').wrap('<pre />');

13

あなたは使用することができる html代わりに、textとの各発生置き換える\nとします<br>。ただし、テキストを正しくエスケープする必要があります。

x = x.replace(/&/g, '&amp;')
     .replace(/>/g, '&gt;')
     .replace(/</g, '&lt;')
     .replace(/\n/g, '<br>');

@Matthew Flaschen:ありがとう、修正されました。
Mark Byers

7
この回答を読んでいる人の中には、これがどれほど危険であるかを知らない人もいるでしょう。ユーザーが指定したテキストでこのソリューションを使用しないでください。PeterMørchのソリューションが望ましいです。
Andrew B.

1
@kulebyashikピーターのソリューションはtextこの回答をhtml直接使用しながら使用します。
John Xiao

1

someElem置換する.html()と文字列内の他のHTMLタグも置換されるため、要素を直接操作することをお勧めします。

これが私の機能です:

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;
}

それを呼び出す:

someElem = nl2br(someElem);

1
読者への注記:この回答は、Firefoxアドオンの開発を計画している場合に特に役立ちます。innerHTMLまたは(jQueryを使用している場合は.html())はW3CとMozillaによって嫌われており、上記のコードはレビュープロセスをクリアするのに非常に役立ちます。詳細については、セキュリティに関する考慮事項@ developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML
Delicia Brummitt

1

これを試して:

$(someElem).html('this<br> has<br> newlines);

0

CSSの空白スペースプロパティを使用するのがおそらく最良の解決策です。FirebugまたはChromeデベロッパーツールを使用して、表示されていた追加のパディングのソースを特定します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.