【发布时间】:2011-04-11 18:04:47
【问题描述】:
我不想承认这一点,但我一直在试图弄清楚如何做到这一点。
例如假装你有以下结构:
<div>
...
<div>
<ul>
<li>
<a href="..."><img class="foo"/></a><!-- "previous" -->
</li>
<li>
<a href="..."><img class="bar"/></a>
</li>
<li>
<a href="..."><img class="foo"/></a><!-- I'm at this node -->
</li>
<li>
<a href="..."><img class="baz"/></a>
</li>
<li>
<a href="..."><img class="foo"/></a><!-- "next" 1 -->
</li>
</ul>
</div>
...
<div>
<ul>
<li>
<a href="..."><img class="foo"/></a><!-- "next" 2 -->
</li>
<li>
<a href="..."><img class="baz"/></a>
</li>
<li>
<a href="..."><img class="foo"/></a><!-- "next" 3 -->
</li>
<li>
<a href="..."><img class="bar"/></a>
</li>
</ul>
</div>
</div>
我在一个与上面的 highlighted "foo" 节点相关的 jQuery 事件处理程序中。我想找到"foo" 的“下一个”img 元素。
不过有 2 个问题。
- 我只想选择 DOM 中比我所在的当前节点更远的“foo”元素(例如,不需要“前一个”foo 和当前 foo)
- 尽管我已将嵌套显示为遵循精确的模式,但生成的代码是/可以 嵌套在 any 级别。 ..因此我不能只做 .parent().parent().parent().siblings().find()... 等等。
如果您可以想象,每次浏览器向 DOM 添加一个节点时,它都会增加一个计数器并为该节点分配索引...您可以检索...我想要的是:
var here = $(this).getIndexInDOM();//e.g. returns 347
$('img.foo').each(function(){
if($(this).getIndexInDOM() > here){//is this past our current index?
doSomething($(this));//use it
break;
}
});
.getIndexInDOM() 方法显然在 jQuery 中不存在......但我很好奇是否有人有解决方案来获得我所追求的“下一个”元素。
目前我能想到的唯一解决方案真的很不优雅,并且在 DOM 中的后半部分图像中表现非常糟糕......
//using vanilla JavaScript
var thisImg = theCurrentImageIHave;//some reference to the DOM element
var found = false;
for(var i=0;i<document.images.length;i++){
if(found){
if(document.images[i].className == 'foo'){
doSomething(document.images[i]);
break;
}
} else {
if(document.images[i] == thisImg){
found = true;
}
}
}
【问题讨论】:
标签: javascript jquery dom jquery-selectors hierarchy