Альтернатива innerHTML для получения содержимого страницы? - PullRequest
1 голос
/ 13 января 2010

В настоящее время я использую innerHTML для извлечения содержимого элемента HTML, и я обнаружил, что в некоторых браузерах он не возвращает точно то, что находится в источнике.

Например, используя innerHTML в Firefox в следующей строке:

<div id="test"><strong>Bold text</strong></strong></div>

Вернется:

<strong>Bold text</strong>

В IE он возвращает исходную строку с двумя закрывающими сильными тегами. Я предполагаю, что в большинстве случаев это не проблема (и может быть преимуществом), что Firefox очищает неправильный код. Однако для того, что я пытаюсь выполнить, мне нужен точный код, который указан в исходном HTML-коде.

Это вообще возможно? Есть ли еще одна функция Javascript, которую я могу использовать?

Ответы [ 6 ]

3 голосов
/ 13 января 2010

Я не думаю, что вы можете получить неправильный код HTML в современных браузерах. И это правильное поведение, потому что у вас нет источника динамически генерируемого HTML. Например, Firefox 'innerHTML возвращает часть дерева DOM , представленную в строке. Не источник HTML. И это не проблема, потому что второй тег </strong> игнорируется браузером.

2 голосов
/ 13 января 2010

innerHTML генерируется не из фактического источника документа, т.е. HTML-файл, но получен из объекта DOM, который отображается браузером. Так что, если IE как-то показывает неправильный HTML-код, то это, вероятно, какая-то ошибка. Не существует такого метода для получения недопустимого HTML-кода в каждом браузере.

1 голос
/ 16 января 2010

Если вам не нужен HTML для рендеринга (например, вы собираетесь использовать его как шаблон JS или что-то еще), вы можете поместить его в текстовую область и получить содержимое с помощью innerHTML.

<textarea id="myTemplate"><div id="test"><strong>Bold text</strong></strong></div></textarea>

А потом:

$('#myTemplate').html() === '<div id="test"><strong>Bold text</strong></strong></div>'

Кроме того, браузер сам решает, как интерпретировать HTML, и он вернет вам только его интерпретацию, а не оригинал.

1 голос
/ 13 января 2010

В общем случае вы не можете получить оригинальный недействительный HTML по причинам, указанным Иваном и Андрисом.

IE также «исправляет» ваш код, как это делает Firefox, хотя и не замечает при сериализации, создавая элемент Element с tagName /strong, который соответствует поддельному конечному тегу. Нет никакой гарантии, что IE сохранит другие недопустимые структуры разметки через цикл разбора / сериализации.

На самом деле даже для действительного кода вывод innerHTML не будет точно таким же, как ввод. Порядок атрибутов не поддерживается, регистр tagName не поддерживается (IE дает вам <STRONG>), пропускаются пробелы в различных местах, ссылки на объекты не поддерживаются и т. Д. Если вам «нужен точный код», вам нужно будет сохранить копию точного кода, например, в переменной JavaScript в блоке <script>, написанном после соответствующего содержимого.

0 голосов
/ 13 января 2010

Вы должны использовать innerXML свойство. Это именно то, что вы хотите достичь.

0 голосов
/ 13 января 2010

innerTEXT? или это имеет тот же эффект?

...