【问题标题】:jQuery on() method on multiple selectors多个选择器上的 jQuery on() 方法
【发布时间】:2011-12-11 04:47:45
【问题描述】:

由于版本 1.7 live 已弃用。

以下示例很容易与新的on 方法兼容:

$('nav li, #sb-nav li, #help li').live('click', function () {
    // code...
});

使用on

$('nav, #sb-nav, #help').on('click', 'li', function () {
    // code...
});

如何使用on重写下面的例子?

 $('#header .fixed-feedback-bn, #sb-sec .feedback-bn').live('click', function () {
     // code...
 });

【问题讨论】:

    标签: javascript jquery jquery-1.7


    【解决方案1】:
    $(document).on('click', '#header .fixed-feedback-bn, #sb-sec .feedback-bn', function () {
         // code...
     });
    

    .live() 只是将文档绑定为监听器。

    我的两分钱是,您几乎总能找到比document 更好的听众。至少,几乎所有页面都使用主要内容包装器。这消除了作为侦听器的页眉、页脚和有时侧边栏中的节点。

    使用.on 作为委派函数的最佳方法是确定最近的共同祖先,该祖先预计永远不会被破坏或以其他方式未绑定事件。例如,如果您有一个由 ajax 请求更新和更改的表单,则侦听器可以是表单节点本身(如果仅更新表单的内容)或围绕表单的容器元素(通常是 div)。如果没有这样的 div,您可以随时添加它,或者您可以直接上树到下一个祖先。

    [编辑添加:]

    在提供的特定示例代码中,很难说是否有更好的侦听器同时包含#header#sb-sec。但是想象一下这些东西与 id "mainContainer" 共享一个祖先,你更高效的代码只是换掉了监听器:

    $('#mainContainer').on('click', '#header .fixed-feedback-bn, #sb-sec .feedback-bn', function () {
       // code...
    });
    

    【讨论】:

      【解决方案2】:

      如果您尝试使用.on() 以便可以在您进行初始.on() 调用后侦听可能创建的DOM 对象上的事件,那么最有效的方法是找到现有的不会来来去去的父对象,您可以将事件侦听器绑定到现在。

      .live() 将所有侦听器放在文档对象(主父级)上,如果您有很多侦听器,效率可能会非常低。

      .on() 允许您指定最有效的父对象。因此,如果您想将所有这些事件处理程序放在一个语句中并且这些 '#header .fixed-feedback-bn, #sb-sec .feedback-bn' 没有共同的父级,那么您必须指定像 Greg 这样的父母所写的文档。

      但是,一种更有效的方法是根据需要将其分开。对于没有动态需求的元素,只需直接绑定到该元素即可。例如,如果 #header 和 #sb-sec 不来/不去并且不需要动态行为,您可以像这样直接找到它:

      $('#header, #sb-sec').on('click', function() {
          // code here
      });
      

      并且,对于您需要一些动态行为的元素,选择一个合适的公共父级并像这样使用公共父级作为事件的捕获点,选择器作为您想要的子元素的过滤器要触发的事件:

      $('#feedback').on('click', '.feedback-bn, .fixed-feedback-bn', function() {
          // code here
      });
      

      【讨论】:

      • 同意;如果您不需要担心被销毁的元素,使用.on().click() 绑定自侦听器是最有效的。我做了一个假设,如果他们需要live(),那是因为他们不想失去听众,但也许这不是一个正确的假设。
      • 我猜测像 #header 这样的东西不是动态来来去去的,也不需要动态行为,但列表中的某些东西可能是因为他们正在考虑 .live() 而不是 @987654332 @。无论如何,我只是试图描述您将如何决定如何选择使用.on() 的不同方式。
      • 代码示例中不应该是$('#header, #sb-sec')吗? IE。用逗号。
      【解决方案3】:

      你可能想看看 live() 的文档,对 on() 的切换记录在案:http://api.jquery.com/live/

      【讨论】:

      • 大多数(较新)事物的文档非常不完整。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      相关资源
      最近更新 更多