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


139

试图弄清楚如何将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.
  }
});

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

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

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

   $("table.planning_grid").on('mouseenter','td',function(){});

有没有办法做到这一点?还是这里的最佳实践是什么?我尝试了下面的代码,但没有骰子。

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

提前致谢!

Answers:


252

那是另一回事。您应该写:

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

1
为什么没有选择器$("table.planning_grid td")
Muers 2011年

11
@Muers,它也可以工作,发问者也承认这一点,但也认为他应该将事件绑定在<table>而不是每个单独的<td>元素上,这确实是正确的方法。
弗雷德里克·哈米迪

37
有充分的理由在<table>而不是<td>上使用.on,这是以后要动态添加<td>的原因。$('table td')。on ...仅会在调用此函数时影响表中的<td>。$('table')。on(...,'td',function ...)将影响您稍后添加到此表的任何<td>。
拉南2012年

8
的确,@ Raanan以及每个注册的事件处理程序都有成本,尽管这是很小的。当您要处理成千上万个单元时,必须强制在<table>一个<td>元素上注册一个处理程序,而不是在每个元素上注册一个处理程序,以实现可用的性能。
弗雷德里克·哈米迪

1
同意 谷歌搜索这个问题非常困难,因为“在”这个词很常见,大多数结果与.bind和有关.live。好的答案,正好是我在寻找的东西:D @Frédéric-您的链接不再链接到idjquery文档页面上的标题。可能是文档更新的结果。但是我在那个页面上找不到这个答案。
nzifnab

186

另外,如果将多个事件处理程序附加到执行相同功能的同一选择器,则可以使用

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

5
这就是我想要的
RozzA

...然后使用e.type获取实际触发的事件类型(在将事件添加为参数之后,即... function(e)...
William T. Mallard

24

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

$('input').on('keyup blur focus', function () {
   //function block
})

11

这里我学到了一些真正有用和基本的东西

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

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

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

$(".photos")
    .on("mouseenter", "li", showPhotos)
    .on("mouseleave", "li", showPhotos);

7

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

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

1

尝试以下代码:

$("textarea[id^='options_'],input[id^='options_']").on('keyup onmouseout keydown keypress blur change', 
  function() {

  }
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.