Подтвердить что ты не робот

Селектор Jquery для элементов <link> в <head>

Мы используем jQuery для анализа некоторого HTML. Затем мне нужно пройти этот документ и найти некоторые элементы. Среди элементов, которые мне нужно найти, есть элементы <link>.

Это отлично работает, чтобы извлечь все элементы <a>:

$(string).find("a")

но это не помогает извлечь элементы <link>:

$(string).find("link")

Параметр string представляет собой содержимое html (например, полученное по запросу).

Любая идея, почему? (Я думаю, что find применяется только к элементам <body>). Кроме того, любая идея о том, как реально извлечь эти элементы <link>?

4b9b3361

Ответ 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).