jQuery元素无法选择父项()

jQuery元素无法选择父项(),jquery,jquery-selectors,Jquery,Jquery Selectors,使用:containssub和sub-containing选择的元素似乎无法到达其父元素 下面的示例应该说明我在Mac上的Safari和Camino Gecko中遇到的问题: <html> <head> <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script> </head> <body>

使用:containssub和sub-containing选择的元素似乎无法到达其父元素

下面的示例应该说明我在Mac上的Safari和Camino Gecko中遇到的问题:

<html>
 <head>
  <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.2.min.js"></script>
 </head>
 <body>
  <p><strong>bar</strong></p>
  <p><strong>&lt;foo&gt;</strong></p>
  <script type="text/javascript">
alert($('body strong:contains("bar")').length);
alert($('body strong:contains("bar")').parent().length);
alert($('body strong:contains("<foo>")').length);
alert($('body strong:contains("<foo>")').parent().length); // this fails
alert($('body strong').length);
alert($('body strong').parent().length); // two p elements
alert($('body strong').parent().parent().length); // one body
  </script>
 </body>
</html>
你知道为什么第四个是0而不是1吗,或者我如何绕过这个问题

在选择器中提到转义名称,但这也不起作用,我不确定它是否适用。

不知道是什么导致contains失败,但您可以使用。filter作为替代方法:

alert($('body strong').filter(function() {
    return /<foo>/.test( $(this).text() );
}).parent().length);
如预期的那样返回1。它很难看,但可以工作。

将作为标记进行计算,因此它的父级除了一个空标记外不包含任何内容,因此0

编辑:要完全理解,请查看以下内容:$'body strong:ContainesFoo'.text.length,其值为5。来自$'body strong:contains'的1。length表示strong中有一个文本节点,因此该节点的长度为1,文本的长度为5


有趣的是,尾随不能正确地选择为>,也不能正确地选择,因为>用作css选择器。因此,这显然是jQuery选择器解析的一个问题。如果选择器中存在,jQuery将参数标识为文档片段,而不是选择器。结果是一个标记名为FOO的元素,同样的选择器也会有同样的问题:

$('body <foo>')
$('body strong:not(<foo>')
本例中唯一的区别是您使用了有效的选择器,而jQuery没有正确地识别它

我尝试了几次基于选择器的变通方法,但这是唯一有效的方法

编辑:似乎您也可以使用。查找:

免责声明:这不是一个解决方案/解决方法,这只是对问题的描述,以及对于好奇的人来说,是什么导致了奇怪的行为

问题的根源在于:

哪个与您的选择器匹配:

body strong:contains("<foo>")
:

所以它认为这是一个HTML片段。所以总的来说,它们目前是等价的:

$('body strong:contains("<foo>")');
$('<foo>');
看到第二个是一个更清楚的说明,它是一个文档片段…没有父级。它在匹配数组中占据第二个位置,您可以看到它只是:

这最终会导致你最终在,构建一个片段


所以,总之,我会认为这是一个jQuery bug。

需要专家对容器的看法。这个节点实际上被解释为一个文档片段,确实非常奇怪。false@Matt-奇怪的部分是foo:alert$'body-strong:包含'[0].nodeName;它认为它是一个文档片段。警报$'body strong:包含'[0].tagName;//FOOThe:contains是:strong上的一个过滤器,所以这真的不包括它,它们在文档中都有父项…可能是:contains括号内文本的某些奇怪部分可以写为裸字或用引号括起来。对>@Nick Craver的评估-注意:包含任何一个元素的外观我知道你知道是的,这是真的,但匹配不在子代上,它是父代上的一个过滤器,例如:某物:包含'somethingElse'选择器应该只匹配一个元素,无论包含的文本有多深。感谢您的分析。你认为用jQuery归档一个bug有用吗?@Daniel:是的,他们可能会在下一个版本中修复这个问题,或者提供更好的解决方法。
/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/
body strong:contains("<foo>")
alert(/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/.test('body strong:contains("<foo>")​​​'));​
$('body strong:contains("<foo>")');
$('<foo>');
alert(/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/.exec('body strong:contains("<foo>")')[1]);​