Селектор Jquery для элементов <link> в <head>
Мы используем jQuery для анализа некоторого HTML. Затем мне нужно пройти этот документ и найти некоторые элементы. Среди элементов, которые мне нужно найти, есть элементы <link>
.
Это отлично работает, чтобы извлечь все элементы <a>
:
$(string).find("a")
но это не помогает извлечь элементы <link>
:
$(string).find("link")
Параметр string
представляет собой содержимое html (например, полученное по запросу).
Любая идея, почему? (Я думаю, что find
применяется только к элементам <body>
). Кроме того, любая идея о том, как реально извлечь эти элементы <link>
?
Ответы
Ответ 1
Из документация функции, которую вы используете для $(string)
(которая является функцией jQuery( html, [ownerDocument] )
):
При передаче в сложном HTML некоторые браузеры не могут создавать DOM, которые точно реплицирует источник HTML предоставлена. Как уже упоминалось, мы используем свойство browser.innerHTML для синтаксического анализа пройденный HTML и вставить его в текущий документ. Во время этого процесса, некоторые браузеры отфильтровывают определенные такие элементы, как <html>
, <title>
или <head>
.. В результате вставленные элементы не могут быть представитель оригинальной строки прошло.
Попробуйте не использовать jQuery для управления целыми HTML-документами.
Обратите внимание, в частности, что link
node в отдельном фрагменте HTML может быть "найден" просто отлично.
Ответ 2
Хорошо, основываясь на том, что я могу найти в исходном коде jQuery, сам движок не будет создавать теги (или фрагменты), которые не "правильно усажены". Даже при передаче строки jQuery распознает, что заголовок уже поставлен и не будет генерировать его.
В конце концов, когда jQuery передается строка HTML, она фактически вызывает document.createElement
и создает список массивов этих элементов.
РЕДАКТИРОВАТЬ. После небольшого исследования, похоже, что браузер фактически ограничивает создание элемента, а не jQuery. В любом случае у вас остались отсутствующие теги. Это приводит меня к тому же самому заключению ниже.
Насколько мне это не нравится, может быть время для манипулирования регулярным выражением/строкой.
Ответ 3
jQuery не может этого сделать, но ваш браузер может: (Не пытайтесь анализировать HTML с регулярным выражением, как предполагалось.)
txt = '<DIV><LINK>a</LINK><B>jelo</B></DIV>';
if(window.DOMParser) {
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
} else { // Internet Explorer
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.loadXML(txt);
}
xmlDoc.getElementsByTagName('LINK');
Помните, что XML чувствителен к регистру, поэтому вам нужно искать "LINK", используя тот же случай, что и в HTML.
Ответ 4
Как и указатель @pimvdb, это не работает:
alert($("<div><link>Test</link></div>").find("link").text());
Объяснение правильное:
Sizzle использует context.getElementsByTagName, которое терпит неудачу, потому что элементы не находятся в DOM.
Но этот способ работы:
alert(("link", $("<div><link>Test</link></div>")).text());
И для некоторых парней, которые сказали, что второй не работает: http://jsfiddle.net/ErickPetru/5Qs3M/. Но, конечно, он явно не находит элементы, которые не находятся в DOM (т.е. На head
).