Вызов jQuery text () сохраняет переводы строк в Firefox, но не в IE - PullRequest
12 голосов
/ 18 марта 2009

Я делаю:

alert($("#div").text());

примерно так:

<div id="div">
&lt;div&gt;
Some text
&lt;div&gt;
</div>

Почему экранированный контент? Потому что иногда он искажен, и я не хочу, чтобы он мешал или нарушал остальную часть документа.

В FF это показывает сохранение новых строк. В IE7 это не так. Мне нужно сохранить белое пространство. Этот контент фактически отправляется в текстовую область для редактирования.

И прежде чем кто-либо порекомендует текстовый редактор, этот код на самом деле не является HTML. Это собственный диалект.

Так как мне сохранить переводы строк в IE?

Ответы [ 3 ]

17 голосов
/ 18 марта 2009

Похоже, это моя проблема: Internet Explorer innerHTML Quirk :

Однако, у innerHTML есть проблема в Internet Explorer.

Стандарт HTML требует преобразование на показе контента. Все виды и количества смежных пробелы свернуты в единый пробел. Это хорошо - так же, как Например, это позволяет мне добавить много разрывов строк в этом исходном файле не беспокоясь о странных разрывы строк в отображаемом тексте.

Internet Explorer применяет эти преобразования при назначении на свойство innerHTML. Это похоже на хорошая идея: это экономит немного времени во время отображения, потому что если представление в памяти уже нормализуется, то браузер не должны нормализовать всякий раз, когда это необходимо отобразить текст.

Есть исключения из Правило нормализации, хотя. Следует отметить, что это

$("#div pre").text()

или просто:

<style type="text/css">
#div { white-space: pre }
</style>

все это волшебным образом работает.

8 голосов
/ 18 марта 2009

Не уверен, что это поможет, но, возможно, вы могли бы попробовать это:

#div {
  white-space: pre;
}
3 голосов
/ 18 марта 2009

См. здесь для обхода:

Взломать это сначала клонировать элемент Вы хотите содержимое, используя cloneNode ().

Далее вы создаете элемент <pre> с createElement (), а затем добавьте свой клонированный узел к нему.

Теперь вы можете получить внутренний текст этого создать элемент <pre> и просто удалить временные объекты. Теперь у вас есть сохраненный пробел текст:)

var cloned = targetElement.cloneNode(true);
var pre = document.createElement("pre");
pre.appendChild(cloned);
var textContent = pre.textContent ?
  pre.textContent : pre.innerText;
delete pre;
delete cloned;

Причина, по которой я клонирую элемент потому что appendChild () будет тянуть это из DOM, и это боль вставьте обратно в правильное положение в ДОМ.

Надеюсь, это поможет нескольким людям там :) 1017 *

...