가장 쉬운 해결책은 다음 CSS 속성을 사용하여 텍스트를 삽입 할 요소의 스타일을 지정하는 것입니다.
white-space: pre-wrap;
이 속성 은 일치하는 요소 내의 공백과 줄 바꿈이 <textarea>. 즉, 연속 된 공백은 축소되지 않고 줄은 명시적인 줄 바꿈에서 끊어집니다 (하지만 요소의 너비를 초과하면 자동으로 줄 바꿈 됨).
지금까지 여기에 게시 된 몇 가지 답변이 HTML 주입 (예 : 이스케이프되지 않은 사용자 입력을에 할당하기 때문에) 에 취약 innerHTML하거나 버그가있는 경우 원본 코드를 기반으로이 작업을 안전하고 올바르게 수행하는 방법에 대한 예제를 제공하겠습니다.
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.append(postText);
var card = document.createElement('div');
card.append(post);
var cardStack = document.getElementById('card-stack');
cardStack.prepend(card);
});
#card-stack p {
background: #ddd;
white-space: pre-wrap;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
원본 코드와 마찬가지로 위의 스 니펫은 append()및 prepend(). 이 글을 쓰는 시점에서 이러한 기능은 여전히 실험적인 것으로 간주되며 모든 브라우저에서 완전히 지원되지는 않습니다. 안전하고 이전 브라우저와의 호환성을 유지하려면 다음과 같이 쉽게 대체 할 수 있습니다.
element.append(otherElement)로 대체 될 수 있습니다 element.appendChild(otherElement).
element.prepend(otherElement)로 대체 될 수 있습니다 element.insertBefore(otherElement, element.firstChild).
element.append(stringOfText)로 대체 될 수 있습니다 element.appendChild(document.createTextNode(stringOfText)).
element.prepend(stringOfText)로 대체 될 수 있습니다 element.insertBefore(document.createTextNode(stringOfText), element.firstChild).
- 특별한 경우로, 경우는
element비어있는, 모두 element.append(stringOfText)와 element.prepend(stringOfText)간단하게 교체 할 수 있습니다 element.textContent = stringOfText.
다음은 위와 동일한 스 니펫이지만 append()또는 사용하지 않습니다 prepend().
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.textContent = postText;
var card = document.createElement('div');
card.appendChild(post);
var cardStack = document.getElementById('card-stack');
cardStack.insertBefore(card, cardStack.firstChild);
});
#card-stack p {
background: #ddd;
white-space: pre-wrap;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
추신. CSS 속성 을 사용 하지 않고이 작업을 수행하려는 경우 white-space대체 솔루션은 텍스트의 모든 줄 바꿈 문자를 <br>HTML 태그 로 명시 적으로 바꾸는 것 입니다. 까다로운 부분은 미묘한 버그와 잠재적 인 보안 허점을 방지 하기 위해이 대체를 수행 하기 전에 먼저 텍스트 에서 HTML 메타 문자 (최소 &및 <)를 이스케이프해야한다는 것 입니다.
아마도 가장 간단하고 안전한 방법은 다음과 같이 브라우저가 HTML 이스케이프를 처리하도록하는 것입니다.
var post = document.createElement('p');
post.textContent = postText;
post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');
document.getElementById('post-button').addEventListener('click', function () {
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.textContent = postText;
post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');
var card = document.createElement('div');
card.appendChild(post);
var cardStack = document.getElementById('card-stack');
cardStack.insertBefore(card, cardStack.firstChild);
});
#card-stack p {
background: #ddd;
}
textarea {
width: 100%;
}
<textarea id="post-text" class="form-control" rows="8" placeholder="What's up?" required>Group Schedule:
Tuesday practice @ 5th floor (8pm - 11 pm)
Thursday practice @ 5th floor (8pm - 11 pm)
Sunday practice @ (9pm - 12 am)</textarea><br>
<input type="button" id="post-button" value="Post!">
<div id="card-stack"></div>
이렇게하면 줄 바꿈이 수정되지만 HTML 렌더러에 의해 연속 된 공백이 축소되는 것을 방지 할 수는 없습니다. 텍스트의 일부 공백을 끊기지 않는 공백으로 대체하여 (일종의) 에뮬레이션 할 수 있지만 솔직히 CSS 한 줄로 사소하게 해결할 수있는 문제는 다소 복잡해집니다.