Вставка новой строки в предварительный тег (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, что неприемлемо для моих целей.

<br /> не добавляет лишних строк в Firefox.

Vincent McNabb 12.10.2008 15:44

Я тоже, я думаю, он оставил \ n после этого, следовательно, мой ответ.

GavinCattell 12.10.2008 15:45

Я думал, что одна из задач jQuery - абстрагироваться от различий между браузерами и версиями. Если бы мне нужно было новое (сломанное) поведение IE, я бы использовал .innerHTML = "..." вместо .html("..."). Я что-то упускаю?

user287466 03.12.2011 23:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
3
23 174
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

<br/> должен выводить только одну строку во всех браузерах. Конечно, удалите и \ n, код должен быть:

document.getElementById("putItHere").innerHTML = "first line<br/>second line";
Ответ принят как подходящий

Эти отчет об ошибке quirksmode.org и комментарии о внутреннем HTML-поведении Internet Explorer могут помочь:

«IE применяет Нормализация HTML к данным, назначенным свойству innerHTML. Это вызывает неправильное отображение пробелов в элементах, которые должны сохранять форматирование, таких как <pre> и <textarea>.»

Это работает в IE?

document.getElementById("putItHere")
    .appendChild(document.createTextNode("first line\nsecond line"));

Я тестировал его с Firefox, и он работает. :-)

Работал как шарм, мне нужно было сделать полную HTML-инъекцию в предварительный тег. Я тестировал вплоть до IE6.

Chad Scira 08.12.2011 03:37

Помогло и в моем случае, и это быстрое решение.

Leo 14.05.2012 15:11

Это отлично сработало для меня в IE8, гораздо более элегантно, чем код JavaScript, записывающий теги HTML.

Steve Ferguson 10.07.2013 23:34

Содержимое внутри тега <pre> не следует рассматривать как HTML.

Фактически, смысл тега <pre> заключается в том, что он действительно отображает форматированный текст.

Использование свойства innerText - это правильный способ изменить содержимое тега <pre>.

document.getElementById("putItHere").innerText = "first line\nsecond line";

Правда, это нормально работает в IE, но обратите внимание, что innerText недоступен в Firefox - методы манипуляции с DOM, вероятно, будут более надежным решением в этом случае, например, ответ Криса Джестера-Янга с использованием appendChild и document.createTextNode.

J c 12.10.2008 16:37

Я считаю это.

Я обнаружил, что 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), который я когда-то создал, я использовал режим редактирования 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]);
        }

Удачи!

На самом деле это лучшее решение, которое я нашел здесь. Вот что у меня получилось, что на самом деле невероятно похоже на то, как обычно работает .innerText. Вот что у меня получилось: element.innerText = ""; element.appendChild(document.createTextNode(textContent));

Karl White 30.01.2017 06:53

Обходной путь можно найти на странице, на которую есть ссылка в принятом ответе. Для удобства использования вот он:

if (elem.tagName == "PRE" && "outerHTML" in elem)
{
    elem.outerHTML = "<PRE>" + str + "</PRE>";
}
else
{
    elem.innerHTML = str;
}

Спасибо, что разместили соответствующую часть ссылки.

user287466 03.12.2011 23:56

if (typeof div2.innerText == 'undefined')
    div2.innerHTML = value;
else
    div2.innerText = value;

это сработало для меня.

Я обнаружил, что innerHTML обрабатывается до применения к элементу, поэтому <br> становится новой строкой, а несколько пробелов удаляются.

Например, чтобы сохранить необработанный текст, вы должны использовать nodeValue;

document.getElementById('pre_id').firstChild.nodeValue='    white space \r\n ad new line';

Я думаю, что это лучший ответ, чем принятый. Принятый ответ не сохраняет атрибуты в теге <pre>, и это потребует еще больше усилий.

user287466 04.12.2011 00:23

Оказывается, в IE9 это не работает. Усвоенный урок - не публиковать сообщения, когда вы устали, разочарованы и тестируете полдюжины браузеров.

user287466 06.12.2011 19:08

Если вы не хотите использовать externalHTML, вы также можете сделать следующее для IE, если дополнительный предварительный тег не является проблемой:

 if (isIE)
     document.getElementById("putItHere").innerHTML = "<pre>" + content+"</pre>";
 else
     document.getElementById("putItHere").innerHTML = content;

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.
}

Вот очень небольшая настройка ответа Эдварда Уайльда, которая сохраняет атрибуты тега <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;
}

Другие вопросы по теме