我写了jQuery函数,通过切换类来显示/隐藏div。下面的代码基本上可以工作。我无法做的是分别控制每个div。单击第二组div 将触发第一组。如何区分每个元素并使相同的函数独立地适用于两个组?
function _open() {
var nextDiv = $("#sub_container").find("[class]").map(function() {
return this.className;
}).get();
$.unique(nextDiv).forEach(function(c) {
$('.' + c).first().removeClass('close').addClass('open');
});
}
function _close() {
$('.open').not('.close').each(function(key, elm) {
setTimeout(function() {
$(elm).removeClass('open').addClass('close');
}, key * 100);
});
}
.container {
float: left;
display: inline;
}
.starter {
display: block;
width: 300px;
height: 100px;
background-color: red;
margin-right: 10px;
margin-bottom: 10px;
color: white;
}
.open {
display: block;
width: 300px;
height: 100px;
background-color: blue;
margin-bottom: 10px;
color: white;
}
.close {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="project1" class="container">
<div class="starter" onclick="_open();">Each click will show a new div</div>
<div id="sub_container">
<div class="close">1</div>
<div class="close">2</div>
<div class="close">3<br><br><button onclick="_close();">click here to hide all divs</button></div>
</div>
</div>
<div id="project2" class="container">
<div class="starter" onclick="_open();">Each click will show a new div</div>
<div id="sub_container">
<div class="close"></div>
<div class="close"></div>
<div class="close"><button onclick="_close();">click here to hide all divs</button></div>
</div>
</div>
代码中的一个问题是,你有两个div 的 idsub_container
在 HTML 中,ID 不应该在同一页面上重复使用,它们应该是单个元素的唯一标识符。
但是,仅自行更改此设置并不能解决您的问题:)
$("#sub_container")
太通用了,它会在整个 DOM 中搜索具有此 ID 的元素,但您要做的是在您刚刚单击的div 组中搜索。您可以使用siblings
.我已经更新了您发布的演示以执行此操作。
必须进行一些更改。
首先,我们需要知道单击了哪个元素。为此,我将链接onclick="_open()"
更新为onclick="_open(event)"
这在调用时传递单击事件,我们可以使用它来确定单击了哪个元素。(您也可以使用this
来简单地传递元素,但由于您经常看到事件被传递,所以我选择这样做(
接下来我们需要找到相关的子容器。那就是这一行:
var $subContianer = $(e.currentTarget).siblings(".sub_container");
我正在使用事件的当前目标(例如,绑定为单击的元素(,然后搜索具有类的同级sub_container
老实说,你的下一段代码对我来说似乎很奇怪,但我把它原封不动地留在原地。我认为它可以做得更简单。但是,我将其更新为使用$subcontainer.find
搜索要打开的div 而不是通用$(selector)
(出于与以前相同的"太通用"原因(
我没有更新关闭代码,我认为尝试这些原则并自行找出这一点是一个很好的练习:)
祝你好运!
function _open(e) {
var $subContianer = $(e.currentTarget).siblings(".sub_container");
var nextDiv = $subContianer.find("[class]").map(function() {
return this.className;
}).get();
$.unique(nextDiv).forEach(function(c) {
$subContianer.find('.' + c).first().removeClass('close').addClass('open');
});
}
function _close() {
$('.open').not('.close').each(function(key, elm) {
setTimeout(function() {
$(elm).removeClass('open').addClass('close');
}, key * 100);
});
}
.container {
float: left;
display: inline;
}
.starter {
display: block;
width: 300px;
height: 100px;
background-color: red;
margin-right: 10px;
margin-bottom: 10px;
color: white;
}
.open {
display: block;
width: 300px;
height: 100px;
background-color: blue;
margin-bottom: 10px;
color: white;
}
.close {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="project1" class="container">
<div class="starter" onclick="_open(event);">Each click will show a new div</div>
<div class="sub_container">
<div class="close">1</div>
<div class="close">2</div>
<div class="close">3<br><br><button onclick="_close();">click here to hide all divs</button></div>
</div>
</div>
<div id="project2" class="container">
<div class="starter" onclick="_open(event);">Each click will show a new div</div>
<div class="sub_container">
<div class="close"></div>
<div class="close"></div>
<div class="close"><button onclick="_close();">click here to hide all divs</button></div>
</div>
</div>
总之:
- 传递
event
以便您知道点击的来源 - 与其通过
$('selector here')
搜索整个 DOM,不如通过查找要从中搜索的元素,然后使用.find
使其更具体
关于其中一些东西的文档: http://api.jquery.com/find/https://api.jquery.com/siblings/