JavaScript

JavaScript 知识量:26 - 101 - 483

16.5 内存与性能><

事件委托- 16.5.1 -

事件委托是一种利用事件冒泡的特性,在父节点上响应事件,而不是在子节点上响应事件的技术。它能够改善性能,因为不需要对每个特定的节点添加事件监听器。

在事件委托中,可以将需要的事件处理程序添加到父元素上,然后利用事件冒泡的特性,将子元素的事件委托给父元素。当子元素的事件被触发时,会通过冒泡传递到父元素,然后在父元素上触发相应的事件处理程序。

例如,如果有多个子元素需要添加相同的点击事件处理程序,使用事件委托可以将这个处理程序添加到它们的父元素上。当点击事件在任何一个子元素上触发时,都会通过冒泡传递到父元素,并触发相应的处理程序。这样可以避免对每个子元素单独添加事件监听器,减少代码的复杂性和维护成本。

以下是一个事件委托的示例:

// 获取父元素  
let parent = document.getElementById('parent');  
  
// 添加事件处理程序  
parent.addEventListener('click', function(event) {  
  // 检查事件源是否为子元素  
  if (event.target.tagName.toLowerCase() === 'li') {  
    // 执行相应的处理程序  
    console.log('子元素被点击:', event.target.textContent);  
  }  
});

在这个示例中,父元素包含多个子元素,每个子元素都是一个列表项(li)。通过在父元素上添加一个click事件监听器,可以利用事件冒泡的特性,将子元素的点击事件委托给父元素。当点击事件在任何一个子元素上触发时,都会通过冒泡传递到父元素,并触发相应的事件处理程序。在事件处理程序中,检查事件源是否为子元素,如果是,就执行相应的处理程序。

取消事件委托- 16.5.2 -

取消事件委托可以通过删除事件委托的程序实现。如果想删除事件处理程序,可以使用removeEventListener方法。这个方法需要传入两个参数,第一个参数是事件的名称,第二个参数是事件处理程序函数。下面是一个简单的示例:

// 获取父元素和子元素  
let parent = document.getElementById('parent');  
let child = document.getElementById('child');  
  
// 添加事件委托处理程序  
parent.addEventListener('click', function(event) {  
  // 检查事件源是否为子元素  
  if (event.target.id === child.id) {  
    // 执行相应的处理程序  
    console.log('子元素被点击');  
  }  
});  
  
// 取消事件委托处理程序  
parent.removeEventListener('click', function(event) {  
  // 检查事件源是否为子元素  
  if (event.target.id === child.id) {  
    // 执行相应的处理程序  
    console.log('子元素被点击');  
  }  
});

在上面的示例中,首先获取了一个父元素和子元素,并在父元素上添加了一个click事件监听器。然后,使用事件委托的特性,在事件处理程序中检查事件源是否为子元素,如果是,就执行相应的处理程序。接下来,使用removeEventListener方法删除了这个事件处理程序,从而取消了事件委托。注意,需要传入与添加事件处理程序时相同的事件名称和处理程序函数。