javascript - jQuery 小部件的全局与本地事件处理程序绑定(bind)

标签 javascript jquery

<分区>

我尝试使用具有丰富功能的 jquery 创建自定义小部件,因此我需要为许多标准事件(例如 dblclick、click、focus、blur 等)自定义处理程序。

我可以应用以下两种策略之一:

  1. 使用 $(document).on('click', '.widget-name .element-class', handle_click);
    全局一次,其中 handle_click 是处理程序函数

  2. 使用$(widget-element).find('.element-class').on('click', handle_click)
    在创建每个小部件实例期间

  3. 像这样绑定(bind)到封闭元素:

    $(this.element)._on('点击', 函数(事件){
    var $this = $(this);
    if($this.is('.element-class')){ handle_click(this, event);
    否则如果($this.is(...)){...}
    ...
    });

哪种方法是更好的设计?
我知道一般来说“这取决于”,所以让我添加一些限制条件:

一个。该小部件通常由约 100 个 DOM 元素组成,这些元素具有专门处理的不同事件。
b.小部件通常不会被销毁并再次创建,只是有时会隐藏起来。
C。通常会加载 1-3 个小部件实例。
d.元素将根据用户请求动态添加,但同时只能<10个
e.在小部件中启用了拖放功能,可能涉及同时重新定位约 20 多个 DOM 元素。
F。小部件本身通常不可拖动。

由于定义了许多单独的事件处理程序,方法 2 是否有显着的性能(或大量内存)损失?(是的,这可能取决于我所知道的浏览器实现。)

最佳答案

使用第一种形式是一次实现事件处理程序的简单方法,但它有额外的开销。实际上,每次单击文档都会调用处理程序,然后 jQuery 必须检查目标是否与选择器匹配;对于第二种形式,浏览器仅在您单击它绑定(bind)到的特定元素时调用处理程序。

第一种形式也可能以一种微妙的方式失败。如果封闭元素有自己的点击处理程序,并且它们使用 event.stopPropagation() ,这将防止事件冒泡到 document。 , 所以 .on()永远不会调用处理程序。

常规应用程序开发人员可以通过将事件绑定(bind)到最深层嵌套的元素来缓解这两个问题,这些元素包含他们要委托(delegate)给的动态元素。但是小部件开发人员对上下文的了解不多,因此可能不得不使用宽 document范围与您的代码一样。如果您可以实现第二种形式,在向 DOM 添加元素时添加处理程序,那可能会更好。

您可以轻松做到这一点的一种方法是使用 jQuery 的 .clone()方法。它带有一个可选参数,指示是否应复制处理程序。因此,创建一个绑定(bind)了处理程序的原型(prototype)元素,然后克隆它,新元素也将具有处理程序。

关于javascript - jQuery 小部件的全局与本地事件处理程序绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17883902/

相关文章:

javascript - jQuery mobile .changePage 无法正常工作

javascript - Internet Explorer 的 CSS 表达式与过滤器和 Javascript

jquery - 创建具有动态值的 json 对象

javascript - 同一页上有 2 个幻灯片

javascript - 在 Parse Cloud Code 中调用更新

javascript - 在 Fabric.js 中分层 Canvas 对象

javascript - 无法使复选框自定义图像显示复选标记

jquery - 为什么选择 SimpleModal 而不是 jQuery UI 对话框?

javascript - 如何使用 JQuery 创建循环动画

javascript - 尝试使用 jquery 从元素中删除所有 html