Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在jQuery中取消绑定/绑定与委托:哪一个是最好的解决方案?_Jquery_Performance_Bind_Unbind_Event Propagation - Fatal编程技术网

在jQuery中取消绑定/绑定与委托:哪一个是最好的解决方案?

在jQuery中取消绑定/绑定与委托:哪一个是最好的解决方案?,jquery,performance,bind,unbind,event-propagation,Jquery,Performance,Bind,Unbind,Event Propagation,我有一个jQuery代码,它处理将事件处理程序解除绑定和绑定到动态添加到页面的元素。该代码具有一个包装函数,该函数将现有处理程序与具有给定id前缀的元素解除绑定,然后绑定事件处理程序,以便任何现有元素都具有该处理程序,并且任何新添加的具有相同id前缀的元素也会获得该处理程序。显然,这会对添加新元素时已经存在的id前缀元素进行额外的解除绑定/绑定。取消绑定是为了防止现有元素获得分配给它们的相同类型的多个处理程序 自从最初编写这段代码以来,我已经了解了jQuery委托函数,它似乎正是我上面所做的 委

我有一个jQuery代码,它处理将事件处理程序解除绑定和绑定到动态添加到页面的元素。该代码具有一个包装函数,该函数将现有处理程序与具有给定id前缀的元素解除绑定,然后绑定事件处理程序,以便任何现有元素都具有该处理程序,并且任何新添加的具有相同id前缀的元素也会获得该处理程序。显然,这会对添加新元素时已经存在的id前缀元素进行额外的解除绑定/绑定。取消绑定是为了防止现有元素获得分配给它们的相同类型的多个处理程序

自从最初编写这段代码以来,我已经了解了jQuery委托函数,它似乎正是我上面所做的


委托函数是否会比我做得更好,这样我就值得花时间重写当前的工作代码来利用它?我所说的更好是指性能、内存使用或其他度量。

当您使用
.delegate()
时,您需要选择一个祖先元素作为指定子代上事件的侦听器。这很好,因为从一开始,您就绑定了一个侦听器,该侦听器在页面上或多或少应该是“永久的”,而不管从其子树中添加或删除了多少有效目标

这当然比
。单击
查看动态页面要好,也比添加或删除元素时在元素上使用一系列
.bind
.unbind
要好

但是,这可能等同于使用
.bind()
来选择一个祖先元素,该元素侦听指定后代上的单击。我对
.bind()
还不够熟悉,不能肯定性能优势

--


作为与您的问题无关的旁白,它的性能比
.live()
更好,因此如果您试图使用
.live()
,我强烈推荐
.delegate()
作为更好的选择。

我只是在发布问题之前阅读了关于.live vs.delegate的内容:)我没有利用您在第三段中描述的任何内容。我正在对特定元素集合本身进行解除绑定/绑定,选择为$('[id^=“idprefix”]')。。。所以我根本不使用祖先元素来监听。我猜这意味着我对已经有处理程序的元素的多次取消绑定/绑定将是一个负面的性能影响。委托?是的,在这种情况下,您使用绑定/取消绑定的方式的性能将不如.delegate。做开关;你知道你想。委托()无论如何要优雅得多。;-:)是的,你抓住我了!重构我来了。谢谢你的帮助。