# 事件委托

  • 对过多元素进行重复的事件监听,如果采用遍历列表并添加多个事件监听的方式,效率将非常低且耗费内存。

  • 这时,可以使用事件委托思想,借用事件冒泡机制,仅为父元素添加一个事件监听,判断触发对象(e.target)是否为子元素,是则使用封装好的逻辑。

# 处理大量节点插入

// 利用documentFragment 和 requestAnimationFrame 进行大量节点插入
(function addNodeList(parentNode, countAddNode, groupSize = 20) {
    // 片段容器
    let fragment = document.createDocumentFragment();

    for (let i = 0; i < countAddNode; i++) {
        const divEl = document.createElement("div");

        divEl.innerHTML = i;
        fragment.appendChild(divEl);

        // 组末
        const isGroupEnd = i > 0 && i % groupSize === 0;
        // 第3000个
        const isListEnd = i === countAddNode - 1;

        if (isGroupEnd || isListEnd) {
            //深复制片段
            const _fragment = fragment.cloneNode(true);

            // 在下一帧插入片段
            requestAnimationFrame(() => {
                parentNode.appendChild(_fragment);
            });
            
            // 重置片段容器
            fragment = document.createDocumentFragment();
        }
    }
})(document.body, 30000, 20);

// 事件委托
// 避免遍历大量子节点添加过多事件监听
document.body.addEventListener('click', function(e){
    if (e.target.nodeName === 'DIV') {
        alert(e.target.innerHTML);
    }
})