HTML-парсер jQuery удаляет некоторые теги без предупреждения, почему и как это предотвратить? - PullRequest
1 голос
/ 23 декабря 2011

Вот вещь,

У меня есть текстовая область (с идентификатором "input_container"), полная HTML-кода, простой пример:

<!doctype html>
<html>
    <head></head>
    <body>
        <a href="www.example.com">the other place</a>
    </body>
</html>

Я проанализировал его с помощью jQuery, вот мой код:

У меня есть вся эта HTML-строка в переменной с именем domString, например:

domString = $('#input_container').val();

Чтобы получить разбор HTML всего внутри переменной domString , мне пришлось обернуть его другим тегом, поэтому я сделал:

dom = "<allhtml>" + domString + "</allhtml>";

И получил все внутри селектора jQuery для анализа:

dDom = $(dom);

После этого я проверил, что находится в dDom, поэтому я сделал

alert(dDom.html());

Это должно дать мне что-нибудь внутри тегов, верно?

Но, к сожалению, все, что я получаю, это:

<a href="www.example.com">the other place</a>

И все остальные теги загадочным образом исчезли. Кто-нибудь может объяснить это явление и сказать мне, как действительно разобрать весь DOM?

Спасибо

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Из документации jQuery :

При передаче в сложном HTML некоторые браузеры могут не генерировать DOM это точно повторяет предоставленный источник HTML. Как уже упоминалось, мы используем свойство браузера .innerHTML для анализа переданного HTML и вставки это в текущий документ. Во время этого процесса некоторые браузеры отфильтровать определенные элементы, такие как <html>, <title> или <head> элементы. В результате вставленные элементы могут не быть репрезентативными исходной строки передано.

Это должно работать вместо:

$('<html />').append($('<head />')).append($('<body />').append($('<a href="www.example.com">the other place</a>')));

Это довольно странная вещь, хотя вы можете подумать о других способах сделать то, что вы пытаетесь достичь, я беспокоюсь, что вы можете страдать от проблемы XY .

0 голосов
/ 23 декабря 2011

Я подозреваю, что вы используете jQuery load или вызов AJAX.

Это попытается загрузить документ в ваш текущий DOM. Он получит содержимое тегов HEAD и BODY через innerHtml, но не сами теги (включая тег HTML, естественно).

Из документации по загрузке jQuery

jQuery использует свойство браузера .innerHTML для анализа полученных данных. документ и вставить его в текущий документ. Во время этого процесса браузеры часто фильтруют элементы из документа, такие как <html>, <title> или <head> элементов. В результате элементы, полученные .load () может быть не таким, как если бы документ был получен непосредственно браузером.

EDIT: Если вы пытаетесь получить полный HTML-код для своей страницы, применяется то же самое. Он будет использовать функцию innerHtml браузера, которая будет вести себя так, как описано выше. HTML действительно не существует после загрузки DOM, поэтому движение в противоположном направлении не обязательно будет на 100% правильным.

Когда вы загружаете этот HTML-код в DOM, он игнорирует теги, поскольку они вообще не загружаются. Затем, когда вы извлекаете, все, что осталось, это ссылка (как и все, что у вас есть в ГОЛОВЕ, но у вас там ничего нет ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...