Я думаю, что это связано с тем, как jQuery обрабатывает строки HTML и создает из них узлы DOM. Среди множества других вещей, jQuery создаст временный <div>
и установит его innerHTML
для любого HTML, который вы передаете $(...)
, создавая таким образом группу DOM-узлов, которые можно извлечь из <div>
и передать обратно Вы как коллекция jQuery.
Проблема, как мне кажется, возникает из-за элементов <html>
, <head>
и <body>
, которые плохо реагируют на добавление к элементу <div>
. Браузеры, как правило, ведут себя по-разному, - некоторые, кажется, игнорируют эти элементы верхнего уровня и просто возвращают вам их содержимое - другие полностью игнорируют элементы и даже не дают вам своих потомков.
Кажется, способ избежать этой кросс-браузерной проблемы - просто заменить проблемные элементы некоторыми другими поддельными элементами перед анализом. Э.Г.
$(
// replace <html> with <foohtml> .. etc.
data.replace(/<(\/?)(head|html|body)(?=\s|>)/g, '<foo$1$2')
).filter("link, script, title").each(function(i) {
console.log($(this));
// do your stuff
});
Кроме того, я не думаю, что filter
будет достаточно, поскольку он не будет нацелен на потомки. Это может быть лучшим подходом:
$(
// replace <html> with <foohtml> .. etc.
data.replace(/<(\/?)(head|html|body)(?=\s|>)/g, '<foo$1$2')
).find('link,script,title').andSelf().filter("link,script,title").each(function(i) {
console.log($(this));
// do your stuff
});