庞大列表上的javascript事件绑定(bind)性能

标签 javascript html

最近我在一个包含 10K 多个项目的页面上被问到,您将如何监听每个项目的点击事件。我告诉他我会为每个项目绑定(bind)一个点击,但看着他的脸,我可以看出这不是他正在寻找的答案。我很难找到有关此类用例的任何在线文章,这就是为什么我不在 SO 上提出这个问题。如果您能提供一些示例代码和您的答案以帮助说明解决方案,将会很有帮助。

最佳答案

你可以使用事件委托(delegate)来做到这一点......

var handleClick = function(e) {
   // Older IEs set the `event` globally.
   e = window.event || e;

   // Older IEs use `srcElement` instead of the spec'd `target`.
   var target = e.target || e.srcElement;

   // For example's sake.
   if (target.tagName.toLowerCase() == 'a' && target.className == 'some_class') {
       // Handle this click.
   }

}

if (document.addEventListener) {
    document.addEventListener('click', handleClick, false);
} else (document.attachEvent) {
    // Older IEs use `attachEvent` instead for adding event listeners.
    document.attachEvent('onclick', handleClick);
} else {
    // When all else fails, let's take a journey back to the 90's.
    document.onclick = handleClick;
}

事件委托(delegate)的工作原理是捕获默认情况下通过所有祖先元素冒泡的事件。

您可以(并且应该)将 document 替换为最接近的一致祖先元素。

上面的代码示例将支持您可能关心的所有浏览器。

如果使用 jQuery 之类的库,代码通常会更简洁...

$(document).on('click', 'a.some_class', function() {
     // Handle this click.
});

关于庞大列表上的javascript事件绑定(bind)性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9900734/

相关文章:

php - 如果选择标签的选项值不是特定值,我如何设置默认值?

php - 为什么我的 if 语句不适用于所有 mysql 结果?

javascript - 如何为 is(constructor, instance) 方法编写 typescript 定义

javascript - 如何从二维数组创建html?

python - CSS 未在 Django 页面中呈现?

html - 包裹在 div 中时 SVG 内部 flex 未对齐

html - 没有列表的水平可滚动图像行

javascript - JS/jQuery 'Tweet this' 按钮不工作

javascript - 使用 nodeValue 读取单元格内容时保留换行符

javascript - 如何使d3 js TreeView 垂直自下而上