[英]How to simplify repetitive jQuery code with different selectors
因此,我有数百个列表,它们被分为30多个类别。
我要做的是使列表显示为:无,对于每个类别都具有click.slideToggle()函数,以及除了单击列表之外的slideUp其他列表,问题是我必须为每个列表编写非常长的重复代码。
我需要有人向我建议一种更好的方式来编写这些javascript行,因此这里是更清晰图片的代码。
<span id='categoryA'>
<div id='listA' class='list'>
<span id='categoryB'>
<div id='listB' class='list'>
<span id='categoryC'>
<div id='listC' class='list'>
<span id='categoryD'>
<div id='listD' class='list'>
<!-- there are around 25 more of similar lists -->
CSS:
.list {
display: none;
}
JavaScript的:
$(document).ready(function() {
$("#categoryA").click(function() {
$("#listA").slideToggle(function() {
$("#listB,#listC,#listD").slideUp();
});
});
$("#categoryB").click(function() {
$("#listB").slideToggle(function() {
$("#listA,#listC,#listD").slideUp();
});
});
$("#categoryC").click(function() {
$("#listC").slideToggle(function() {
$("#listA,#listB,#listD").slideUp();
});
});
$("#categoryD").click(function() {
$("#listD").slideToggle(function() {
$("#listA,#listB,#listC").slideUp();
});
});
});
问题的关键是我想,每一次#categoryA
被点击,它的slideToggle #listA
,如果我点击#categoryB
,它的slideToggle #listB
和效果基本show任何其他列出目前已了slideDown。
我有30多个类别。 如何使代码更简单,更高效? 有人有更聪明的方法吗?
<span class='category' id='categoryA'>Title A</span>
<div id='listA' class='list'>...</div>
<span class='category' id='categoryB'>Title B</span>
<div id='listB' class='list'>...</div>
<span class='category' id='categoryC'>Title C</span>
<div id='listC' class='list'>...</div>
<span class='category' id='categoryD'>Title D</span>
<div id='listD' class='list'>...</div>
和
$(function() {
$(document).on("click", ".category", function () {
$(this).next(".list").slideToggle(function () {
$(".list").not(this).slideUp();
};
});
});
备注:
.not()
从jQuery中的列表中排除元素。 this
的“完整”的回调里面.slideToggle()
是指动画元素(因此,“完整”的回调每个动画元素调用一次,毕竟不是选定的元素已经完成滑动-这是要记住,当你动画在某个时刻有多个元素) 这是一个非常简单的函数,它使用jQuery.on
委托事件,而.next
和.not
函数用于在用户单击触发器时过滤选择。
/**
* @param [jQuery] $obj - the jQuery selection we want to accordionize
* @param [Object] opt - optional settings
* @return [jQuery] $obj
*/
function accordionize($obj, opt){
opt = $.extend({
triggers: 'dt',
content: 'dd'
}, opt || {});
// bind the click events to all elements that match our trigger selection
$obj.on('click', opt.triggers, function(e){
// Get the associated content element
var $target = $(this).next(opt.content);
$target.slideDown(function(){
$obj.find(opt.content).not($target).slideUp();
});
});
// Create a custom event to setup accordion.
// hides all content elements except the first.
$obj.on('accordionize.reset', function(){
$obj.find(opt.content).hide().first().show();
});
return $obj.trigger('accordionize.reset');
}
它要求您将内容包装在一个元素中:
<dl class="accordion">
<dt>Topic One</dt>
<dd>Ipsum loren</dd>
<dt>Topic two</dt>
<dd>Some fun facts about topic two</dd>
<dt>Topic three</dt>
<dd>Some fun facts about topic three</dd>
</dl>
<div class="accordion">
<h3 class="trigger">Topic One</h3>
<div class="content">Ipsum loren</div>
<h3 class="trigger">Topic two</h3>
<div class="content">Some fun facts about topic two</div>
<h3 class="trigger">Topic three</h3>
<div class="content">Some fun facts about topic three</div>
</div>
然后像这样调用函数:
accordionize($('dl.accordion'));
accordionize($('div.accordion'), {
triggers: '.trigger',
content: '.content'
});
让我们使用它。
html :
<span id='A' class="category">
<div id='listA' class='list'>
<span id='B'class="category">
<div id='listB' class='list'>
<span id='C'class="category">
<div id='listC' class='list'>
<span id='D' class="category">
<div id='listD' class='list'>
//there are around 25 more of similar lists//
css :
.list {
display: none;
}
javascript :
$(document).ready(function() {
$(".category").click(function(){
id = jQuery(this).attr("id");
$(".list").slideUp();
$("#list"+id).slideToggle();
});
});
希望这能按预期工作。
我的理解是,每当单击类别时,相应的列表就会向下滑动,而类别中的其他列表也会向上滑动。 如果是这种情况,那么无论何时单击任何类别,都可以向上滑动所有列表,仅向下滑动属于该类别的列表。
$(".category").click(function(){
$(".list).slideUp();
$(this).find('.list').slideDown();
});
您可以尝试这样的事情
$("span").on("click", function(){
var that = $(this)
that.slidToggle(function(){
$("#listA,#listC,#listD").slideUp();});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.