2011-10-03 113 views
0

我有这个设置,只是为了找到一个元素的index(),但它应该用相同的nodename来查看同一级别的元素。jquery find index()相同的节点名称

返回的数字不符合预期。请参阅代码评论。我想filteredByNodeNameIndex为'2'。

希望这个例子的代码是足够清晰:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
    <title>TestDrive</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
    <script type="text/javascript" > 
     function TestDrive() 
     { 
      var $obj = $("#div2"); 
      console.log("$obj.length:" + $obj.length); // returns: 1 

      var $filtered = $obj.parent().children($obj[0].nodeName); // find all divs in same parent 
      console.log("$filtered.length:" + $filtered.length); // returns: 3 

      var $obj_clone = $filtered.find($obj); // find original element again. Is something wrong here? 
      console.log("$objAgain.length:" + $obj_clone.length); // returns: 0 

      var filteredByNodeNameIndex = $obj_clone.index(); // i want the number 2 here 
      console.log("filteredByNodeNameIndex:" + filteredByNodeNameIndex); // returns: -1 
     } 
    </script> 
</head> 
<body onload="new TestDrive()"> 
    <div id="container"> 
     <!-- some random elements just for test --> 
     <a></a> 
     <div id='div1'></div> 
     <div id='div2'></div> 
     <span></span> 
     <span></span> 
     <a></a> 
     <div></div> 
     <a></a> 
    </div> 
</body> 
</html> 

谁能那个地方,这是错的?

+0

什么是不工作?数字出错了,代码被炸毁了吗? –

+0

这些数字与预期不符。请参阅代码评论。我想filteredByNodeNameIndex为'2'。 var filteredByNodeNameIndex = $ obj_clone.index(); //我想要数字2在这里 –

回答

5

尝试使用.filter代替.find

var $obj_clone = $filtered.filter($obj); 

.find的问题是,它会查找匹配的元素的儿童,没有兄弟姐妹。从文档:

获取匹配的 元素中的每个元素的后代,由选择器,jQuery对象或元素过滤。

相比.filter

减少匹配元素到那些选择器或 匹配的传递函数的测试。

+0

谢谢,这真的很有帮助。 –

1

在第三次尝试时,您试图找到孩子本身,显然不会返回所需的值。

画报:

var $filtered = $obj.parent().children($obj[0].nodeName); 
//Select set A 

var $obj_clone = $filtered.find($obj); 
//Search for set A among the CHILDREN of set A --> Fails, obviously? 

var filteredByNodeNameIndex = $obj_clone.index(); 
//Unexpected results. 
+0

这是真的,但没有解释如何解决它。查看关于'filter'的其他回复。 –

+1

这个问题不是“如何解决”,而是“解释什么是错的”。 –

+0

谢谢,这真的很有帮助。 –

2

find只搜索所选节点的子节点。您正在尝试使用filter的功能。您需要:

 var $obj_clone = $filtered.filter($obj); // find original element again. Is something wrong here? 
0

尝试:

var $obj_clone = $filtered.filter($obj); 

.find()只查找儿童