gpt4 book ai didi

javascript - jQuery 中的事件委托(delegate)——哪种方法更好?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:56 25 4
gpt4 key购买 nike

为了编写更好的代码并改进我使用 jQuery 的方式,我最近一直在阅读一些东西。我学到的新技巧之一是将事件委托(delegate)与 jQuery 结合使用。

在阅读时,我发现了两种“假定的”不同的解决方法。下面是用于说明它们的代码片段。

假设我有一个这样的 HTML block :

<html>
<head>
<title>Test Code</title>
</head>
<body>
<div id="switcher">
<button id="button1">Button 1</button>
<button id="button2">Button 1</button>
<button id="button3">Button 2</button>
<button id="button4">Button 3</button>
<button id="button5">Button 4</button>
<button id="button5">Button 5</button>
<button id="button6">Button 6</button>
<button id="button7">Button 7</button>
<button id="button8">Button 8</button>
<button id="button9">Button 9</button>
</div>
<!-- rest of code here -->
</body>
</html>

点击时,我想:

  1. 检索单击的按钮的 ID(用于进一步操作)。
  2. 将任何按钮的类切换为“事件”。

而不是这样做:

$('#switcher').find('button').click(function(){
var $element = $(this);
var elementid = this.id;
$element.toggleClass('clicked');
//rest of code here
});

我可以这样做(方法 1)

$('#switcher').click(function(eventName){
if ($(eventName.target).is('button')) {
var $element =$(eventName.target);
var elementid = eventName.target.id;
$element.toggleClass('active');
//rest of code here
}
});

或者这个(方法二)

$('#switcher').on('click', 'button', function(){
var $element = $(this);
var elementid = this.id;
$element.toggleClass('active');
//rest of code here
});
  1. 这 2 个实际上都是委托(delegate)技术吗?
  2. 如果是这样,这两种方法中哪一种更快(或性能更好)并且更好地处理委派?
  3. 有浏览器限制吗?

最佳答案

在您非常具体的情况下,当单击 button 元素(在所有浏览器上)时,这两种方法将提供完全相同的功能并且性能将相同(因为它是一个点击事件,这将是一个微小的差异,也很难以准确的方式进行测试。

这适用于您的特定结构:

<div id="switcher">
<button id="button1">Button 1</button>
<button id="button3">Button 2</button>
</div>

但是如果 DOM 结构发生变化,只有一点点:

<div id="switcher">       
<button id="button1">
<div class="inner">Button 1</div>
</button>
<button id="button3">
<div class="inner">Button 2</div>
</button>
</div>

...那么只有“官方”jQuery 事件委托(delegate)会实际检测所有子项的点击事件。

如果您已经在您的页面中使用了 jQuery,那么破解事件监听器来模拟事件委托(delegate)是没有用的。除了编写更多代码之外,您不会获得任何优势。有人提到了性能:忘记它与点击事件。无用的优化至少与过早的优化一样糟糕,因为它会浪费您的时间并降低代码的可读性,但在这种情况下,它甚至不是优化(或者它只是一个需要认真证明的极客游戏)。

请注意,点击事件很少(或从不?)代表性能问题。它们只会偶尔发生一次。 RequestAnimationFrame、滚动或调整大小可能代表问题,而不是点击。单击事件可能是性能问题的唯一情况是,如果您有一个异常(非常极端!)复杂的 DOM 结构:但在这种情况下,这可能意味着您应该首先修复它。

关于javascript - jQuery 中的事件委托(delegate)——哪种方法更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39878452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com