大型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_item
在on
方法调用。