JQuery .on()方法,具有一个选择器的多个事件处理程序

but*_*php 128 javascript jquery jquery-selectors jquery-1.7

试图弄清楚如何将Jquery .on()方法与具有多个与之关联的事件的特定选择器一起使用.我之前使用过.live()方法,但不太确定如何用.on()完​​成同样的壮举.请参阅下面的代码:

$("table.planning_grid td").live({
  mouseenter:function(){
     $(this).parent("tr").find("a.delete").show();
  },
  mouseleave:function(){
     $(this).parent("tr").find("a.delete").hide();        
  },
  click:function(){
    //do something else.
  }
});
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过调用以下方式分配多个事件:

 $("table.planning_grid td").on({
    mouseenter:function(){  //see above
    },
    mouseleave:function(){ //see above
    }
    click:function(){ //etc
    }
  });
Run Code Online (Sandbox Code Playgroud)

但我相信正确使用.on()会是这样的:

   $("table.planning_grid").on('mouseenter','td',function(){});
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?或者这里的最佳做法是什么?我尝试了下面的代码,但没有骰子.

$("table.planning_grid").on('td',{
   mouseenter: function(){ /* event1 */ }, 
   mouseleave: function(){ /* event2 */ },
   click: function(){  /* event3 */ }
 });
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Fré*_*idi 246

那是另一种方式.你应该写:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    click: function() {
        // Handle click...
    }
}, "td");
Run Code Online (Sandbox Code Playgroud)

  • 有一个很好的理由在<table>上而不是在<td>上使用.on,如果你以后动态添加<td>.$('table td').on ...只会在您调用此函数时影响表中的<td>.$('table').on(...,'td',function ...)将影响您稍后将添加到此表中的任何<td>. (35认同)
  • @Muers,它也会工作,提问者也会这样认可,但也认为他应该将事件绑定在`<table>`而不是每个单独的`<td>`元素,这确实是正确的方法. (11认同)
  • 实际上,@ Raanan并且每个事件处理程序一个寄存器都有成本,尽管很小.当你处理数千个单元时,在`<table>`而不是每个`<td>`元素的一个处理程序上注册一个处理程序变为强制实现可用性能. (8认同)
  • 同意。很难用谷歌搜索这个问题,因为“on”是一个很常见的词,大多数结果都与“.bind”和“.live”相关。很好的答案,正是我正在寻找的:D @Frédéric - 您的链接不再链接到 jquery 文档页面上的标头“id”。可能是更新文档的结果。但我在该页面上找不到这个答案。 (2认同)

Pir*_*jan 175

此外,如果您有多个事件处理程序连接到执行相同功能的同一个选择器,您可以使用

$('table.planning_grid').on('mouseenter mouseleave', function() {
    //JS Code
});
Run Code Online (Sandbox Code Playgroud)

  • 这就是我想要的 (5认同)

小智 20

如果要在不同事件上使用相同的功能,可以使用以下代码块

$('input').on('keyup blur focus', function () {
   //function block
})
Run Code Online (Sandbox Code Playgroud)


Ima*_*idi 11

我从这里学到了一些非常有用和基础的东西.

链接功能,在这种情况下,其中大多数jQuery的功能,包括工作原理是非常有用功能输出过.

它的工作原理是因为大多数jQuery函数的输出都是输入对象集,因此您可以立即使用它们,使其更短更智能

function showPhotos() {
    $(this).find("span").slideToggle();
}

$(".photos")
    .on("mouseenter", "li", showPhotos)
    .on("mouseleave", "li", showPhotos);
Run Code Online (Sandbox Code Playgroud)


小智 7

您可以通过以下方式组合相同的事件/功能:

$("table.planning_grid").on({
    mouseenter: function() {
        // Handle mouseenter...
    },
    mouseleave: function() {
        // Handle mouseleave...
    },
    'click blur paste' : function() {
        // Handle click...
    }
}, "input");
Run Code Online (Sandbox Code Playgroud)