1

我注意到 jquery find 中的一个错误。

如果我使用可能引用 foo 本身的选择器调用 foo.find,它将不起作用。这里的例子。

http://jsfiddle.net/CgfPj/6/(编辑:更新小提琴以更清楚地解释我想要做什么)

test.find 应该能够找到一个作为 div 子级的跨度,但它似乎不能,因为 div 是测试本身。这是一个错误吗?

4

3 回答 3

1

#testdiv你引用的。

.find()#test返回匹配给定选择器的后代。#test没有后代divs,因此test.find("div > span")不匹配任何元素。

要获得您的直系span后代,#test应使用:

test.find("> span")

小提琴


根据 OP 编辑​​进行编辑:

$("#test > span, #test div > span")

将获得所有spans 的直接后代#test以及s 内部的所有span元素的直接后代div#test

:parentIs(div)据我所知,CSS 选择器规范和 jQuery 中都没有选择器之类的东西,但是您可以使用过滤器功能轻松填补这一空白:

var spans = test.find('span').filter(function() {
    return $(this).parent()[0].tagName.toLowerCase() === 'div';
});

$("#result").text(spans.length);

小提琴

于 2012-10-03T01:08:16.160 回答
0

如果我看这个权利..

var test = $("#test");
$("#result").text(test.find("div > span").length)
$("#result2").text($("div > span").length)​

通过定义test为 div 本身的元素。您本质上是在告诉您find在该 div 中寻找另一个具有跨度的 div。尝试

$("#result").text(test.find("span").length)
于 2012-10-03T01:09:44.193 回答
0
<div id="test">
  <span>hello</span>
</div>   

$("#result").text(test.find("div > span").length)

长度 = 0 的输出是绝对正确的。这不是错误,而是预期的行为。

您的 span 嵌套在带有#test的 div 内

test.find("div > span") // 试图找到一个跨度,它是嵌套在#test div 中的 div 的子对象。因为它在#test 中没有 div,所以这会给你 0。

在这种情况下将返回 1 的 HTML 是

<div id="test">
   <div>
      <span>hello</span>
   </div>
</div> 
于 2012-10-03T01:20:29.863 回答