最も簡単な解決策は、次の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の1行で簡単に解決できるものではかなり複雑になっています。