<;的Jquery选择器;链接>;<;头>;

<;的Jquery选择器;链接>;<;头>;,jquery,dom,Jquery,Dom,我们使用jQuery解析一些HTML。然后我需要遍历该文档并找到一些元素。在我需要查找的元素中,有元素 这可以很好地提取所有元素: $(string).find("a") 但这无法提取元素: $(string).find("link") 字符串参数是html内容(例如,根据请求接收) 知道为什么吗?(我猜find只适用于元素)。另外,关于如何实际提取这些元素,有什么想法吗?就像@pimvdb指出的那样,这是行不通的: alert($("<div><link>Test&

我们使用jQuery解析一些HTML。然后我需要遍历该文档并找到一些元素。在我需要查找的元素中,有
元素

这可以很好地提取所有
元素:

$(string).find("a")
但这无法提取
元素:

$(string).find("link")
字符串
参数是html内容(例如,根据请求接收)


知道为什么吗?(我猜
find
只适用于
元素)。另外,关于如何实际提取这些
元素,有什么想法吗?

就像@pimvdb指出的那样,这是行不通的:

alert($("<div><link>Test</link></div>").find("link").text());
警报($(“测试”).find(“链接”).text();
解释是正确的:

Sizzle使用context.getElementsByTagName,这会失败,因为元素不在DOM中

但这种方法是有效的:

alert(("link", $("<div><link>Test</link></div>")).text());
alert((“链接”、“测试”).text();
对于一些说第二种方法不起作用的人来说:。但是当然,它显然找不到不在DOM上的元素(即
头部
)。

好吧,根据我在中找到的,引擎本身不会创建没有“正确放置”的标记(或片段)。即使在传递字符串时,jQuery也会识别已提供的标头,并且不会生成它

毕竟,当jQuery被传递一个HTML字符串时,它实际上调用了
document.createElement
,并创建了这些元素的数组列表

编辑:经过进一步调查,看起来是浏览器限制了元素的创建,而不是jQuery。无论哪种方式,你都没有标签。这让我得出了下面相同的结论

尽管我不喜欢它,但可能是时候对regex/string进行操作了。

来自您用于
$(string)
(这是函数
jQuery(html,[ownerDocument])
):

当传入复杂的HTML时,有些 浏览器可能不会生成 完全复制HTML源代码 假如如前所述,我们使用 要分析的浏览器的.innerHTML属性 传递的HTML并将其插入 当前文件在这个过程中, 有些浏览器会过滤掉某些内容 元素,如
,或
元素。
因此 插入的元素可能不可用 原始字符串的代表 通过了

尽量不要使用jQuery来处理整个HTML文档


请特别注意,独立HTML片段中的
链接
节点。

jQuery无法做到这一点,但您的浏览器可以做到:(不要像某些人建议的那样尝试使用正则表达式解析HTML。)

txt='ajelo';
if(window.DOMParser){
parser=新的DOMParser();
xmlDoc=parser.parseFromString(txt,“text/xml”);
}else{//Internet Explorer
xmlDoc=新的ActiveXObject(“Microsoft.XMLDOM”);
xmlDoc.async=“false”;
xmlDoc.loadXML(txt);
}
getElementsByTagName('LINK');

请注意XML是区分大小写的,因此您需要使用与HTML中相同的大小写来搜索“链接”。

字符串变量
中有什么?字符串
是您想要解析的HTML转储吗?您可以提供更多信息吗
$('link')
在广义上可以正常工作,所以这似乎不是问题。@BoltClock:HTML文档的字符串(!)表示形式。我不明白这一点<代码>$(“

john

”)
返回
[​, ​约翰​

​],但
$('

john

')。查找('p')
什么也得不到。第一个不起作用,因为它没有附加到DOM中。第二个起作用,因为您错过了
$
,因此根本没有使用
链接
选择器。@pimvdb:我认为第一个应该起作用。关于第二个,您是对的。Sizzle使用
上下文。getElementsByTagName
,它失败是因为e元素不在DOM中。此外,
不能包含这样的文本,因为它从来没有像这样保存
innerHTML
。第一个不起作用,因为您试图获取标签的
文本
,而标签应该是空的。
标签不应该包含这样的内容。jQuery似乎会删除它。如果您的e解释是正确的,可以工作。问题不在于
innerText
,问题只是解释了标签将不在文档中,因此无法定位。如果检查以下元素,您将看到许多标题标签已被免除生成(你无法穿越那些不存在的东西)。不,这不是jQuery的错。请阅读文档。@Tomalak:我实际上是在深入了解它,似乎有一些浏览器的限制。它找到的浏览器标签不应该存在/已经存在。所以你很可能是正确的。@Downvoter:请解释。我认为这很清楚。不幸的是,这也不起作用DOMParser无法解析无效XML的HTML:(这是真的。我猜您需要解析任何网站上的随机HTML?在这种情况下,您唯一的选择(除了编写自己的解析器,或使用其他人制作的解析器)是隐藏的iframe(但您需要小心,因为iframe将运行代码)你可能应该在谷歌上搜索一个javascript 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');