大晚上,等方案,年末了,順便傳一篇總結,主要是第三部分,事件委託的應用。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
}
}
}
複製代碼