JQuery разделяет некоторые элементы HTML от строки при использовании .html ()?

У меня есть var, который содержит полную страницу HTML, включая голову, HTML, тело, и т.д. Когда я передаю ту строку в .html () функция, полосы jQuery все те элементы, такие как тело, HTML, голова, и т.д., который я не хочу.

Мой var данных содержит:

<html>
<head>
<title>Untitled Document</title>
</head>
<body>
</body>
</html>

Затем мой jQuery:

// data is a full html document string
data = $('<div/>').html(data);
// jQuery stips my document string!
alert(data.find('head').html());

Я должен управлять полной строкой страницы HTML, так, чтобы я мог возвратить то, что в своей стихии. Я хотел бы сделать это с jQuery, но это кажется всеми методами, добавьте (), предварительно ожидайте () и HTML () вся попытка преобразовать строку в dom элементы, которые удаляют все другие части полной страницы HTML.

Есть ли иначе, что я мог сделать это? Я был бы прекрасным использованием другого метода. Моя заключительная цель состоит в том, чтобы найти определенные элементы в моей строке, таким образом, я полагал, что jQuery будет лучшим, так как я так привык к нему. Но, если это собирается обрезать и удалить части моей строки, я оказываюсь перед необходимостью искать другой метод.

Идеи?

17
задан Nic Hubbard 21 March 2010 в 22:10
поделиться

3 ответа

После нескольких быстрых тестов мне кажется, что это поведение вызвано не jQuery, а браузером.

Как вы можете легко убедиться сами (DEMO http://jsbin.com/ocupa3 )

var data = "<html><head><title>Untitled Document</title></head><body><p>test</p></body></html>";
data = $('<div/>').html(data);
alert(data.html());

дает разные результаты в разных браузерах

Opera 10.10

<HEAD><TITLE>Untitled Document</TITLE></HEAD><P>test</P>

FF 3.6

<title>Untitled Document</title><p>test</p>

IE6

<P>test</P>

, так что это не имеет ничего общего с jQuery. Это браузеры, которые удаляют некоторые теги, когда вы вставляете целую строку html в div. Но вам нужно будет пройти через весь код jQuery для html () , чтобы быть уверенным. И вам нужно будет сделать это для всех браузеров, поскольку jQuery пытается выполнить свою работу несколькими разными способами.


В качестве решения я советую вам изучить использование iframe (возможно, скрытого) и установить это содержимое iframe в имеющуюся html-строку. Но имейте в виду, что возиться с iframe и программно изменять их содержимое - тоже непростая задача. Также существуют различные причуды, связанные с браузером, и проблемы со временем.

12
ответ дан 30 November 2019 в 14:00
поделиться

Нет, функция jQuery html просто отправляет строку в свойство элемента innerHTML , которое является функцией браузера, которая сообщает ему, что нужно проанализировать HTML на элементы DOM и добавить их на страницу.

Ваш браузер не работает со страницей как с данными HTML, он работает с ней как с DOM и импортирует / экспортирует HTML.

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

2
ответ дан 30 November 2019 в 14:00
поделиться

Нет необходимости в контейнере div.

Вы пробовали это?:

var foo = $(data);  // data is your full html document string

Затем вы можете искать внутри него следующим образом:

$('.someClass', foo); // foo is the document you created earlier

Обновление:

Как заметил другой ответ, то, как это будет действовать, зависит от браузера.

Я немного просмотрел jQuery docs и обнаружил следующее:

Когда HTML сложнее, чем одиночный тег без атрибутов, так как это в приведенном выше примере фактическое создание элементов обрабатывается механизмом браузера innerHTML . В частности, jQuery создает новый {{1} }

и устанавливает свойство innerHTML элемента на переданный фрагмент HTML .

Кажется, что когда вы используете весь html-документ в виде строки, это ничем не отличается от установки свойства innerHTML для div , которое вы делаете с помощью createElement .

0
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: