大型DOM树减少了jQuery点击事件

问题解决了!

Dhoelzgen和Matthew Blancarte根据公认的答案解决了这个问题(特定于我的配置)。 问题的关键在于,当我应该使用jQuery的on方法来委托事件处理时,我将’click’事件绑定到所有 .inventory_item元素,如下所示:

   $(document).ready(function(){ $('#inventory_index').on('click', '.inventory_item', function(){ alert('Click event fired!'); }); });   

使用这种技术我大大提高了我的应用程序的响应能力。

继续阅读所有细节……

概观

我正在开发一个在“单页”(例如www.myapp.com/app.php)中运行的库存应用程序,并使用jQuery执行XHR来加载和转出DIV的各种内容。

我正在使用jQuery 1.9.1和jQuery UI 1.8(因为我必须出于遗留原因)。

问题:慢点击事件

我遇到的问题是随着DOM树变大,点击事件变得越来越慢。 当从搜索返回约1000个项目时,延迟当前约为2秒。

这是jQuery的示例:

   $(document).ready(function(){ var inventory_item = $('#inventory_index.inventory_item'); inventory_item.on('click', function(){ alert('Click event fired!'); }); });   

和HTML:

 
Inventory Item 0
Inventory Item 1000

起初我认为是因为图像存在于每个.inventory_item ,但是在实现延迟加载后,我发现问题与DOM中的元素数量有关,而不是与图像有关。他们自己。

试图解决方案

正如您在上面的示例代码中所看到的,我已经尝试实现过去几天我能找到的最佳解决方案。 也就是说,将.inventory_item的集合包装在一个可识别ID的#inventory_index元素中,以便为jQuery提供一个关于它应该在哪里查看的提示。

而且,另外,创建一个javascript对象来尝试从DOM搜索中获得更多时间(尽管,老实说,我不确定它如何工作的,或者它是否有帮助)。

有没有其他人遇到这个问题,并有任何他们可以分享的解决方案或建议?

当前最好的想法

截至目前,我想象的唯一方法就是通过在#inventory_index加载较少的结果来简单地减少DOM树中元素的数量。 这是一个选项,但我真的希望能够将数百个(如果不是数千个) .inventory_item到索引中。

奖金

奇怪的是,mouseenter和mouseleave事件瞬间爆发。 你可以在这里看到类似的问题:

jQuery委托对大型列表上的click事件的性能 – 如果动态添加更多元素,速度会降低吗?

如何使用jQuery的方法来附加这样的事件处理程序:

 $('#inventory_index').on('click', '.inventory_item', ...) 

这样,您只需添加一个事件处理程序,而不是每个库存项目添加一个事件处理程序。 没有测试它,只是偶然发现你添加了很多事件监听器。

一些解释:

如果您使用$('#inventory_index .inventory_item')作为选择器,您最终$('#inventory_index .inventory_item')单个事件处理程序绑定到每个库存项目,这是一个问题,尤其是如果您有很多这样的问题。 另一方面,上面的#inventory_index选择器只是向用作包装器的元素添加一个事件处理程序,它负责处理由第二个选择器过滤的元素的所有点击,这是第二个参数.inventory_itemon方法调用。