gpt4 book ai didi

javascript - 有没有更奇特的方法来获得上一个相同类别的元素?

转载 作者:行者123 更新时间:2023-11-29 17:22:44 24 4
gpt4 key购买 nike

我有这样的表格行:

<tr class="parent0 row3" data-parent="0">
<td>...</td>
</tr>
<tr class="parent3 row7" data-parent="3">
<td>...</td>
</tr>
<tr class="parent3 row12" data-parent="3">
<td>...</td>
</tr>
<tr class="parent0 row8" data-parent="0">
<td>...</td>
</tr>
<tr class="parent0 row9" data-parent="0">
<td>...</td>
</tr>

所以如果我有一个点击处理程序:

$(document).on({
"click": function(){
var parentId = $(this).data("parent");
//get previous sibling:
//OPTION A:
var prevParentA =
$(this).prev("parent" + parentId); //works sometimes
//OPTION B:
var prevParentB =
$(this).prevAll("parent" + parentId).eq(0); //works all the time but ugly...
}

}, "tr");

选项 A 仅在前一个项目具有相同的父项时才有效,但当情况不是时,prevParentA === [],这不是想要的结果。
选项 B 似乎总是有效,但它丑陋 因为它选择了 ALL 之前匹配该类别的项目并选择了第一个它找到了。

有没有比选项B更好的选择?

最佳答案

jQuery 没有比您的选项 B 更好的东西了。我一直认为这是一个缺失的功能,因为我也经常想要类似的东西。幸运的是,制作自己的方法并不难:

jQuery.fn.prevFind = function(selector) {
var elems = [];
this.each(function(i, item) {
while (item = item.previousSibling) {
if (item.nodeType == 1) {
if ($(item).is(selector)) {
elems.push(item);
break;
}
}
}
});
return(this.pushStack(elems, "prevFind", selector));
}

对于 nextFind() 也可以这样做。

在你的例子中,而不是这个:

$(this).prevAll("parent" + parentId).eq(0);

你会用这个:

$(this).prevFind("parent" + parentId)

下面是使用一些通用代码的 prevFind()nextFind() 的实现:

(function($) {

$.each({
'prevFind' : 'previousSibling',
'nextFind' : 'nextSibling'
}, function(method, dir) {

$.fn[method] = function (selector) {

var elems = [];

this.each(function(i, item) {
while (item = item[dir]) {
if (item.nodeType == 1) {
if ( $.find.matches(selector, [item]).length ) {
elems.push(item);
break;
}
}
}
});

return this.pushStack(elems, method, selector);
};
});

}(jQuery));

这是 fiddle :http://jsfiddle.net/nDYDL/1/

关于javascript - 有没有更奇特的方法来获得上一个相同类别的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com