纯 js 中的可折叠列表优化
Collapsable list optimisation in pure js
我正在构建一个可折叠的列表,在我试图优化我的代码时,我发现自己做了一些吐出错误的东西,但由于某种原因仍然以某种方式工作。
旧代码:http://jsfiddle.net/3pmcrqmj/
function addEvent(element, myEvent, fnc) {
return ((element.attachEvent) ? element.attachEvent('on' + myEvent, fnc) : element.addEventListener(myEvent, fnc, false));
}
var list = document.getElementById('list');
var items = list.getElementsByTagName('ul');
var items2 = list.getElementsByTagName('li');
for(var i = 0; len = items.length, i < len ; i++){
items[i].parentNode.setAttribute('class','collapse');
addEvent(items[i].parentNode, 'click', function(event) {
event = event || window.event;
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true);
if(this.getAttribute('class')==='collapse'){
this.setAttribute('class','expand');
} else {
this.removeAttribute('class');
var temp = this;
setTimeout(function(){
temp.setAttribute('class','collapse');
},200);
}
});
}
我的修复尝试:http://jsfiddle.net/3pmcrqmj/1/
function addEvent(element, myEvent, fnc) {
return ((element.attachEvent) ? element.attachEvent('on' + myEvent, fnc) : element.addEventListener(myEvent, fnc, false));
}
var list = document.getElementById('list');
var items = list.getElementsByTagName('ul');
var items2 = list.getElementsByTagName('li');
for(var i = 0; len = items.length, i < len ; i++){
items[i].parentNode.setAttribute('class','collapse');
}
addEvent(list, 'click', function(event) {
for(var i = 0; len = items.length, i < len ; i++){
event = event || window.event;
event.stopPropagation ? event.stopPropagation() : (event.cancelBubble=true);
if(event.target.getAttribute('class')==='collapse'){
event.target.setAttribute('class','expand');
target.setAttribute('class','expand');
} else {
event.target.setAttribute('class','collapse');
target.setAttribute('class','collapse');
}
}
});
如何正确冒泡,以便不必在每个列表项上插入事件侦听器?
通过检查单击元素的nodeName
(== li
)和子<li>
-元素的存在来重写处理程序,因此它仅作用于这些元素:
addEvent(list, 'click', function (e) {
e = e || window.event;
var from = e.target || e.srcElement;
if (!/^li$/i.test(from.nodeName) ||
!from.querySelectorAll('li').length) {return true;}
var expand = /collapse/i.test(from.className || '');
from.setAttribute('class', expand ? 'expand' : 'collapse');
});
这是你重写的jsFiddle
相关文章:
- 要求输入在数据列表中
- 从javascript创建一个列表
- 如何使用jQuery选择下拉列表的值
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- Javascript按钮下拉列表
- 如何使用json将对象列表从java转换为javascript
- 区分JSON中的矩阵和列表列表
- jQuery表单添加不适用于下拉列表
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 接受不在列表中的值-引导组合框
- 优化离子应用程序中的大列表视图
- 春季MVC优化了选择后的下拉列表
- 纯 js 中的可折叠列表优化
- 基于复选框和下拉列表选择优化列表
- 使用 Javascript 优化一个巨大的无序列表
- 如何在 php 中优化存储和获取庞大的列表
- 优化显示简单项目列表的模型/视图
- 请帮助优化和编写Jquery函数,获取json数据并将其附加到选择列表选项
- 选定的项目列表在html优化