当我有一个匹配多个元素的类时,有一种方法可以单独处理每一层父母
$(".myWidespreadClass").parents() // [immediateParent1, immediateParent2, deeperAncestor1, deeperAncestor2]
我希望能够运行像.each()这样的东西,但是第一次迭代在直接父母身上运行,第二次迭代在下一级更深层次的祖先等...
答案 0 :(得分:5)
引人入胜的问题。我想你会想要一个循环,就像这样:
var parents = $(".myWidespreadClass").parent(); // Not plural!
while (parents[0]) {
// Process them, e.g.
parents.each(function() { /* ... */ });
// Get the next tier
parents = parents.parent(); // Not plural!
}
Live example | Live source - 更新,但请参见下文,可能会提前终止
您可能希望提前终止一点,例如:
while (parents[0] && parents[0].nodeName !== "BODY") {
......取决于您的需求。我在示例中做了。见下文。
更新实际上,您必须小心提前终止,在您处理父母时可能会更好地过滤,例如:
var parents = $(".myWidespreadClass").parent();
while (parents[0]) {
// Process them, e.g.
parents.each(function() {
if ($.contains(document.body, this)) {
// This one is under `body`, process it
display("Visiting " + this.nodeName + "." + this.className);
}
});
// Get the next tier
parents = parents.parent(); // Not plural!
}
原因是您的初始元素集可能在DOM中处于非常不同的级别,因此您将比其他元素更快地到达其中一些元素的最顶层元素。上面的body
检查可能不适合您的需求,但您明白了。