我们使用jQuery来解析一些HTML。然后我需要遍历该文档并找到一些元素。在我需要找到的元素中,有<link>
个元素。
这非常适合提取所有<a>
元素:
$(string).find("a")
但这不能提取<link>
元素:
$(string).find("link")
string
参数是html内容(例如,在请求时收到)。
知道为什么吗? (我想find
仅适用于<body>
元素。另外,关于如何实际提取这些<link>
元素的任何想法?
答案 0 :(得分:8)
来自您$(string)
所用功能的the documentation(函数jQuery( html, [ownerDocument] )
):
传递复杂的HTML时,有些 浏览器可能无法生成DOM 完全复制HTML源代码 提供。如上所述,我们使用 浏览器的.innerHTML属性要解析 传递的HTML并将其插入到 目前的文件。 在此过程中, 一些浏览器过滤掉某些
<html>
,<title>
或其他元素<head>
元素。因此, 插入的元素可能不是 代表原始字符串 过去了。
尽量不要使用jQuery来操作整个 HTML文档。
请特别注意,HTML can be "found" just fine的独立摘要中的link
节点。
答案 1 :(得分:1)
好吧,根据我在source code of jQuery中可以找到的内容,引擎本身不会创建没有“正确就位”的标签(或片段)。即使在传递字符串时,jQuery也会识别出标题已经提供并且不会生成它。
毕竟,当jQuery传递一串HTML时,它实际上正在调用 document.createElement
并创建这些元素的数组列表。
编辑:经过一番调查后,看起来浏览器实际上限制了元素的创建,而不是jQuery。无论哪种方式,你都会留下缺席的标签。这让我在下面得出了同样的结论。
尽管我不喜欢它,但可能是正则表达式/字符串操作的时候了。
答案 2 :(得分:0)
jQuery不能这样做,但是你的浏览器可以:(不要尝试用正如someome所建议的正则表达式来解析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区分大小写,因此您需要使用与HTML中相同的大小写搜索“LINK”。
答案 3 :(得分:-2)
像@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
上)。