JQuery 返回与查询匹配的元素集合,并在集合上调用方法对每个成员执行该方法——这就是它们同时打开的原因。
- 要
details
一次打开一个,您可以遍历集合并打开第一个未打开的集合。
- 要关闭最后一个打开的元素,您可以从
details
集合中创建一个数组,反转数组,从数组中创建一个新集合,在反转的集合中找到第一个打开的元素并关闭它(phew)。
- 要关闭所有打开的元素,只需
open
从整个details
集合中删除该属性。
请注意,这open
是一个没有值的属性 - 如果属性存在,则 details 元素打开,如果不存在,则关闭。
不幸的是,jQuery 没有“hasAttribute”函数,虽然已经设计了变通方法,但其中许多不适用于没有值的属性。然而,原生hasAttribute
元素方法的存在时间比<details>
元素长,并且在所有现代浏览器中都受支持。
所以使用 jQuery(大部分)你可以尝试以下方法。键入“a”打开单个元素,键入“c”关闭最后一个打开的元素,或键入“z”关闭所有打开的(详细信息)元素:
document.onkeyup = function(e) {
var e = e || window.event;
if (e.which == 65) { // 'a' - open one
$('details').each( function() {
if( this.hasAttribute("open")) {
return true;
}
$(this).attr("open", true);
return false;
});
}
else if(e.which == 67) { // 'c' - close one
$($('details').get().reverse()).each( function() {
if( this.hasAttribute("open")) {
$(this).removeAttr("open");
return false;
}
});
}
else if(e.which == 90) { // 'z' - close all
$('details').removeAttr('open');
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<details>
<summary>Details1</summary>
test1
<details>
<summary>Details2</summary>
test2
<details>
<summary>Details3</summary>
test3
</details>
</details>
</details>