Вставка новой строки в предварительный тег (IE, Javascript)
В IE, когда я вставляю текст в тег <pre>
, символы новой строки игнорируются:
<pre id="putItHere"></pre>
<script>
function putText() {
document.getElementById("putItHere").innerHTML = "first line\nsecond line";
}
</script>
Использование \r\n
вместо простой \n
не работает.
<br/>
работает, но вставляет лишнюю пустую строку в FF, что неприемлемо для моих целей.
Ответы
Ответ 1
Эти отчет об ошибках quirksmode.org и комментарии о innerHTML поведение Internet Explorer могут помочь:
"IE применяет нормализацию HTML к данным, присваиваемым свойству innerHTML. Это приводит к некорректному отображению пробелов в элементах, которые должны сохранять форматирование, например, <pre> и < lt; & TextArea GT;".
Ответ 2
Обходной путь можно найти на странице, связанной с принятым ответом. Для удобства использования здесь:
if (elem.tagName == "PRE" && "outerHTML" in elem)
{
elem.outerHTML = "<PRE>" + str + "</PRE>";
}
else
{
elem.innerHTML = str;
}
Ответ 3
Это работает в IE?
document.getElementById("putItHere")
.appendChild(document.createTextNode("first line\nsecond line"));
Я тестировал его с помощью Firefox, и он работает.: -)
Ответ 4
<br/>
shoud выводит только одну строку во всех браузерах. Конечно, удалите \n, код должен быть:
document.getElementById("putItHere").innerHTML = "first line<br/>second line";
Ответ 5
Содержимое внутри тега <pre>
не следует рассматривать как HTML.
Фактически, точка тега <pre>
такова, что она отображает форматированный текст.
Использование свойства innerText - это правильный способ изменения содержимого тега <pre>
.
document.getElementById("putItHere").innerText = "first line\nsecond line";
Ответ 6
IE9 не нормализует пробелы, в отличие от своих предшественников.
Вам следует протестировать поддержку, а не таргетинг на какой-либо конкретный браузер. Например...
var t = document.createElement(elem.tagName);
t.innerHTML = "\n";
if( t.innerHTML === "\n" ){
elem.innerHTML = str;
}
else if("outerHTML" in elem)
{
elem.outerHTML = "<"+elem.tagName+">" + str + "</"+elem.tagName+">";
}
else {
// fallback of your choice, probably do the first one.
}
Ответ 7
Я считаю это.
Я обнаружил, что IE использует \r\n, а Fx (другие) использует \n
var newline;
if ( document.all ) newline = '\r\n';
else newline = '\n';
var data = 'firstline' + newline + 'second line';
document.getElementById("putItHere").appendChild(document.createTextNode(data));
Для модуля TinyMCE (wysiwyg editor), который я однажды сделал, я закончил с использованием режима редактирования BR i
и очистили его от отправки и т.д.
Этот код проходит через все элементы BR внутри элементов PRE и заменяет BR символами новой строки.
Обратите внимание, что код основан на TinyMCE API, но может быть легко написан с использованием стандартного Javascript.
Очистка:
var br = ed.dom.select('pre br');
for (var i = 0; i < br.length; i++) {
var nlChar;
if (tinymce.isIE)
nlChar = '\r\n';
else
nlChar = '\n';
var nl = ed.getDoc().createTextNode(nlChar);
ed.dom.insertAfter(nl, br[i]);
ed.dom.remove(br[i]);
}
Удачи!
Ответ 8
Я обнаружил, что innerHTML обрабатывается до его применения к элементу, следовательно <br> становится новой строкой и удаляются несколько белых пробелов.
Чтобы сохранить исходный текст, вы должны использовать nodeValue, например:
document.getElementById('pre_id').firstChild.nodeValue=' white space \r\n ad new line';
Ответ 9
Если вы не хотите использовать outerHTML, вы также можете сделать следующее для IE, если дополнительный предварительный тег не является проблемой:
if(isIE)
document.getElementById("putItHere").innerHTML = "<pre>" + content+"</pre>";
else
document.getElementById("putItHere").innerHTML = content;
Ответ 10
Вот очень маленькая настройка для ответа Эдварда Уайльда, которая сохраняет атрибуты на <pre> тег.
if (elem.tagName == "PRE" && "outerHTML" in elem) {
var outer = elem.outerHTML;
elem.outerHTML = outer.substring(0, outer.indexOf('>') + 1) + str + "</PRE>";
}
else {
elem.innerHTML = str;
}
Ответ 11
if (typeof div2.innerText == 'undefined')
div2.innerHTML = value;
else
div2.innerText = value;
который работал у меня.