大晚上,等方案,年末了,顺便传一篇总结,主要是第三部分,事件委托的应用。javascript
appengChild
只能添加Dom元素,不能是文本形式的Dom;fragment
不能直接经过innerHtml
添加内容;var body = document.getElementById('body');
var fragment = document.createDocumentFragment();
for (var i = 0; i < 100; i++) {
var btn = document.createElement('button');
btn.id = i;
btn.className = 'btn';
btn.type = 'button';
btn.innerText = '按钮'
fragment.appendChild(btn);
}
body.appendChild(fragment);
复制代码
参考:javascript事件监听与事件委托html
var date2 = new Date();
body.addEventListener('click', function(e) {
var element = e.target;
if (element.className == 'btn') {
console.log(element.id);
}
})
var date3 = new Date();
复制代码
var btn = document.querySelectorAll('.btn');
var date1 = new Date();
for (var i = 0; i < btn.length; i++) {
(function(i) {
btn[i].addEventListener('click', function() {
console.log(i);
});
})(i)
}
复制代码
/** * @description: 事件委托 * @parentFeature 父节点内监听 * @currentFeature 目标节点的特征 * @path e.paht * @return: boolean */
function delegation(parentFeature, targetFeature, path) {
for (var i = 0, length = path.length; i < length; i++) {
var item = path[i];
if (!item.nodeName) {
// 当节点为document或者window的时候,nodeName为undefined
return false
}
if (item.matches(targetFeature)) {
// 当paht链上节点符合目标特征
console.log(item)
return true
}
if (item.matches(parentFeature)) {
// 往上找到了监听的父节点
return false
}
}
}
/** * @description: 获取元素上的状态消息 * @infoTargetFeature: 所要获取消息上的元素 * @infoName: 所须要获取的父元素的属性名 * @return: 状态信息 */
// 事件委托成功,而且继续寻找,获取li元素上的数据
function getLiInfo(parentFeature, targetFeature, path, infoTargetFeature, infoName) {
for (var i = 0, length = path.length; i < length; i++) {
var item = path[i];
if (!item.nodeName || item.nodeName=="#document") {
// 当节点为document或者window的时候,nodeName为undefined
return false
}
// console.log(JSON.stringify(item)) //{} 空对象
if (item.matches(targetFeature)) {
// 当path链上节点符合目标特征
var maxLength = 10;
var parentEle = item.parentNode;
var info = true
for (var i = 0; i < maxLength; i++) {
// 当往上寻找父元素,直到找到设定父元素的所须要的状态信息,并返回
if (parentEle.matches(infoTargetFeature)) {
console.log(parentEle.dataset)
info = parentEle.dataset[infoName];
console.log(info)
return info
}
parentEle = parentEle.parentNode
}
return true
}
if (item.matches(parentFeature)) {
// 往上找到了监听的父节点
return false
}
}
}
复制代码