У меня есть jQuery для получения некоторого содержимого textarea и вставки его в li.
Я хочу, чтобы он визуально сохранял разрывы строк.
Должен быть действительно простой способ сделать это...
У меня есть jQuery для получения некоторого содержимого textarea и вставки его в li.
Я хочу, чтобы он визуально сохранял разрывы строк.
Должен быть действительно простой способ сделать это...
demo: http://so.devilmaycode.it/jquery-convert-line-breaks-to-br-nl2br-equivalent
function nl2br (str, is_xhtml) {
var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}
вы можете просто:
textAreaContent=textAreaContent.replace(/\n/g,"<br>");
Поместите это в свой код (желательно в общую библиотеку функций js):
String.prototype.nl2br = function()
{
return this.replace(/\n/g, "<br />");
}
Использование:
var myString = "test\ntest2";
myString.nl2br();
создание функции прототипа строки позволяет использовать ее для любой строки.
В духе изменения рендеринга вместо изменения содержимого следующий CSS заставляет каждую новую строку вести себя как <br>
:
white-space: pre;
white-space: pre-line;
Почему два правила: pre-line
влияет только на новые строки (спасибо за подсказку, @KevinPauli). IE6-7 и другие старые браузеры возвращаются к более экстремальной pre
nowrap
которая также включает в себя nowrap
и отображает несколько пробелов. Подробности об этих и других настройках (pre-wrap
) в Mozilla и css-tricks (спасибо @Sablefoste).
Хотя я, как правило, не склонен к склонности SO ко второму угадыванию вопроса, а не к ответу на него, в этом случае замена символов новой строки на разметку <br>
может повысить уязвимость к атакам с помощью инъекций с немытым пользовательским вводом. Вы пересекаете ярко-красную линию всякий раз, когда обнаруживаете, что меняете вызовы .text()
на .html()
что подразумевает буквальный вопрос. (Спасибо @AlexS за выделение этого момента.) Даже если вы исключите угрозу безопасности в то время, будущие изменения могут непреднамеренно представить ее. Вместо этого этот CSS позволяет получать жесткие разрывы строк без разметки с помощью более безопасного .text()
.
Решение
Используйте этот код
jQuery.nl2br = function(varTest){
return varTest.replace(/(\r\n|\n\r|\r|\n)/g, "<br>");
};
Эта функция JavaScript учитывает, использовать ли вставку или заменить для обработки подкачки.
(Вставьте или замените разрывы строк HTML)
/**
* This function is same as PHP nl2br() with default parameters.
*
* @param {string} str Input text
* @param {boolean} replaceMode Use replace instead of insert
* @param {boolean} isXhtml Use XHTML
* @return {string} Filtered text
*/
function nl2br (str, replaceMode, isXhtml) {
var breakTag = (isXhtml) ? '<br />' : '<br>';
var replaceStr = (replaceMode) ? '$1'+ breakTag : '$1'+ breakTag +'$2';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, replaceStr);
}
Для этого я написал небольшое расширение jQuery:
$.fn.nl2brText = function (sText) {
var bReturnValue = 'undefined' == typeof sText;
if(bReturnValue) {
sText = $('<pre>').html(this.html().replace(/<br[^>]*>/i, '\n')).text();
}
var aElms = [];
sText.split(/\r\n|\r|\n/).forEach(function(sSubstring) {
if(aElms.length) {
aElms.push(document.createElement('br'));
}
aElms.push(document.createTextNode(sSubstring));
});
var $aElms = $(aElms);
if(bReturnValue) {
return $aElms;
}
return this.empty().append($aElms);
};
чтобы улучшить принятый ответ @Luca Filosofi,
если необходимо, изменение начального предложения этого регулярного выражения как /([^>[\s]?\r\n]?)
также будет содержать случаи, когда новая строка появляется после тега AND some whitespace, а не только тег, за которым сразу следует новая строка
Другой способ вставить текст из текстового поля в DOM, сохраняя разрывы строк, заключается в использовании свойства Node.innerText, которое представляет отображаемое текстовое содержимое node и его потомков.
Как получатель, он аппроксимирует текст, который получит пользователь, если он выделит содержимое элемента курсором и затем скопирует его в буфер обмена.
Свойство стало стандартным в 2016 году и хорошо поддерживается современными браузерами. Могу ли я использовать: глобальный охват 97%, когда я отправил этот ответ.