[英]Targeting a sister/brother element with the same data-id with jQuery
希望这不会太过分了-但我想知道jQuery中最快的方法是使用相同的data id属性来定位另一个元素(即$(this).whatever
)。 我目前有以下标记(如果您使用最新的Bootstrap,您会注意到这只是一张带有导航标题的简单卡片):
<div class="card text-center">
<div class="card-header pb-0">
<ul id="contactGroups" class="nav justify-content-center nav-tabs card-header-tabs">
<li class="nav-item" data-id="1">
<a class="nav-link active" href="#">Contact Us</a>
</li>
<li class="nav-item" data-id="2">
<a class="nav-link" href="#">Business Enquiries</a>
</li>
<li class="nav-item" data-id="3">
<a class="nav-link" href="#">Follow Us</a>
</li>
</ul>
</div>
<div class="card-body active" data-id="1">
<h5 class="card-title">Special title treatment</h5>
<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
<div class="card-body hidden" data-id="2">
<h5 class="card-title">Special title treatment</h5>
<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
<div class="card-body hidden" data-id="3">
<h5 class="card-title">Special title treatment</h5>
<p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
如您在上面的标记中看到的,我已经将data-id属性添加到列表元素-我想进入并找到它的对应data-id(那些卡身处于活动状态或卡身处于隐藏状态的数据),所以我可以开始和他们一起玩。 但是(!!)我不想选择我分配的任意#id或.class。 我将如何去做呢?
到目前为止,我的jQuery如下(但是,这只会将当前类从非活动类(或无类)切换到活动类,从而产生标签swop错觉:
$('#contactGroups').each(function(){
$(this).find('li').each(function(){
$(this).on('click', function() {
$('#contactGroups').find('.active').removeClass('active');
$(this).find('a').addClass('active');
})
});
});
任何想法将不胜感激。
我不太清楚你是否
想要找到与li
相同的data-id
的div
,或者
想找到其它li
s表示是姐弟(“兄弟” +“姐妹” =“兄弟姐妹”) li
被点击其中也有data-id
属性。
在li
的点击处理程序中, this
将引用被点击的li
(它或其后代a
元素)。 考虑到这一点:
您可以使用attr
获得该元素的data-id
:
var theId = `$(this).attr("data-id");
(除非您需要data
提供的功能,否则请不要使用data("id")
; 更多信息请参见 。)
您可以使用find
或兄弟姐妹通过siblings
在给定容器中查找元素。 因此,从单击的li
,您可以执行.closest(".card-header").siblings(...)
来访问标头的兄弟姐妹,也可以执行.closest(".card").find(...)
搜索所有包含.card
。 前者更具体,但更脆弱; 如果您的结构有所变化,则后者会更强大。 在性能方面都不重要。
因此,我可能会选择.card
并将find
与标签和属性选择器组合使用:
$(this).closest(".card").find("div[data-id='" + theId + "']")...
FWIW,无需钩住每个li
click
。 只需使用事件委托:
$("#contactGroups").on("click", "li[data-id]", function() {
var theId = $(this).attr("data-id");
var div = $(this).closest(".card").find("div[data-id='" + theId + "']");
// ...
});
在li
click处理程序中使用$(this).siblings("[data-id]")
查找其所有具有data-id
(具有任何值)的兄弟姐妹。
...根据您的评论:
$("#contactGroups").on("click", "li[data-id]", function() { var theId = $(this).attr("data-id"); var div = $(this).closest(".card").find("div[data-id='" + theId + "']"); div.removeClass("hidden").addClass("active"); div.siblings("[data-id]").removeClass("active").addClass("hidden"); });
.hidden { display: none; } .active { font-weight: bold; }
<div class="card text-center"> <div class="card-header pb-0"> <ul id="contactGroups" class="nav justify-content-center nav-tabs card-header-tabs"> <li class="nav-item" data-id="1"> <a class="nav-link active" href="#">Contact Us</a> </li> <li class="nav-item" data-id="2"> <a class="nav-link" href="#">Business Enquiries</a> </li> <li class="nav-item" data-id="3"> <a class="nav-link" href="#">Follow Us</a> </li> </ul> </div> <div class="card-body active" data-id="1"> <h5 class="card-title">(1) Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> <div class="card-body hidden" data-id="2"> <h5 class="card-title">(2) Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> <div class="card-body hidden" data-id="3"> <h5 class="card-title">(3) Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
each
因为您只有一个contactGroups
。 data
功能。 closest
功能,您可以获取li
元素的祖先。 toggleClass
函数添加或删除active
类。 $('div[data-id="${id}"]')
查找相关的li
的div
。 $('#contactGroups li').on('click'), ...);
$('#contactGroups li').on('click', function() { $(this).closest('#contactGroups').find('.active').toggleClass('active'); $(this).children('a').toggleClass('active'); $('div.card-body.active').toggleClass('active'); let id = $(this).data('id'); $(`div[data-id="${id}"]`).toggleClass('active'); });
.active { color: green !important; background-color: lightgreen; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="card text-center"> <div class="card-header pb-0"> <ul id="contactGroups" class="nav justify-content-center nav-tabs card-header-tabs"> <li class="nav-item" data-id="1"> <a class="nav-link active" href="#">Contact Us</a> </li> <li class="nav-item" data-id="2"> <a class="nav-link" href="#">Business Enquiries</a> </li> <li class="nav-item" data-id="3"> <a class="nav-link" href="#">Follow Us</a> </li> </ul> </div> <div class="card-body active" data-id="1"> <h5 class="card-title">Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> <div class="card-body hidden" data-id="2"> <h5 class="card-title">Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> <div class="card-body hidden" data-id="3"> <h5 class="card-title">Special title treatment</h5> <p class="card-text">With supporting text below as a natural lead-in to additional content.</p> <a href="#" class="btn btn-primary">Go somewhere</a> </div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.