Селектор Jquery для <link>элементов в <head> - PullRequest
13 голосов
/ 21 июня 2011

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

Это прекрасно работает для извлечения всех элементов <a>:

$(string).find("a")

, но это не работаетдля извлечения <link> элементов:

$(string).find("link")

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

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

Ответы [ 4 ]

8 голосов
/ 21 июня 2011

Из документации функции, которую вы используете для $(string) (которая является функцией jQuery( html, [ownerDocument] )):

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

Старайтесь не использовать jQuery для управления целыми документами HTML.

Обратите внимание, в частности, что link узел в автономном фрагменте HTML может быть "найден" просто отлично .

1 голос
/ 21 июня 2011

Что ж, исходя из того, что я могу найти в исходном коде jQuery , сам движок не будет создавать теги (или фрагменты), которые не "правильно установлены". Даже при передаче строки jQuery распознает, что заголовок уже предоставлен, и не будет его генерировать.

В конце концов, когда jQuery передается строка HTML, он на самом деле вызывает document.createElement и создает список массивов этих элементов.

РЕДАКТИРОВАТЬ : После небольшого исследования выясняется, что браузер фактически ограничивает создание элементов, а не jQuery. В любом случае, у вас остались отсутствующие теги. Который подводит меня к такому же выводу ниже.

Насколько мне это не нравится, может быть, настало время для регулярных выражений / манипулирования строками.

0 голосов
/ 21 июня 2011

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.

0 голосов
/ 21 июня 2011

Как указал @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).

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