jQuery text () 및 개행


114

말할 수 있고 싶어

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

브라우저에서 줄 바꿈으로 렌더링됩니다. 내가 찾은 유일한 해결 방법은 someElem에서 css 속성 'white-space'를 'pre'로 설정하는 것입니다. 이것은 거의 작동하지만 패딩을 0으로 설정하더라도 텍스트와 someElem의 상단 사이에 성가 시게 큰 패딩이 있습니다. 이것을 제거하는 방법이 있습니까?


2
<pre>태그로 감싸고 (.text () 대신 .html () 사용) 텍스트 파일 또는 일반 텍스트에서 줄 바꿈을 유지하는 가장 쉽고 최상의 솔루션입니다 (이것은 Karim의 답변에서 제안합니다). 그러나이이에 대한 새로운 대안은 사용하는 것입니다 white-space: pre-wrap;cleong의 대답에 제안
edwardtyl

1
append()대신 test()<br/>대신 사용 하지 않는 이유 는 \n무엇입니까? 이 같은 -$(someElem).append("this <br/> has <br/> newlines");
에판 아메드

답변:


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 년 발견 : 여전히 관련성이 있으며 여전히 질문에 대한 답입니다.
트로이 해리스

6
이 게시물에 오류가 있습니다. 올해는 2015 년이 아니라 2017 년입니다. 다른 모든 것은 정확 해 보입니다.
JDB은 여전히 모니카 기억

1
new Date("2016");
Brandito

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>


첫 번째 코드 조각의 두 번째 줄에 누락 된 닫기 괄호가 있습니다.
Mahmoud Fayez 2013 년

1
이것은 실제로 OPs 질문에 대답합니다
Tommy

가장 좋은 것은 매력처럼 일하고 문제를 해결했습니다.
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는 함수 내부에 생성되지만 이제 루프 외부에 생성됩니다. 완전히 기능 외부에있을 수 있지만 사용하기가 번거로워집니다.
Peter V. Mørch

1
나는 @ cleong의 대답은 이것에 대한 최선의 해결책이라고 생각
minillinim

당신이 당신의 텍스트에 명시 적으로 개행 문자가있는 경우에, 당신은 사용 분할 할 수 있습니다 text.split(/\\n/), 또는 text.split(/\\\\n|\\n|\n/). \n문자열에 리터럴 제어 문자 를 포함하는 API를 사용하여 JSON 형식의 텍스트를 전달하는 동안이 문제가 발생했습니다 .
D. 프랜트

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
이 답변을 읽는 일부 사람들은 이것이 얼마나 위험한지 모를 것입니다. 사용자가 제공 한 텍스트에는이 솔루션을 사용하지 마십시오. Peter Mørch의 솔루션이 바람직합니다.
Andrew B.

1
text이 답변은 html직접 사용 하는 동안 @kulebyashik Peter의 솔루션 사용 .
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 또는 (.html () if using jQuery)는 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.