jquery委托和更改事件的问题

时间:2011-12-03 16:43:57

标签: jquery

我想在我的文件更改事件中使用委托功能,但我没有运气。这是我正在尝试做的事情:

$("#file").delegate("change", function() {    
    $("#submit_form").trigger('click');
});

我的更改活动没有被调用...我是否遗漏了某些内容或者我是否可以将委托用于更改事件?

1 个答案:

答案 0 :(得分:14)

.delegate()需要一个代表目标元素的选择器。

$("#file").delegate('.selector_of_element_to_watch', "change", function() {    
    $("#submit_form").trigger('click');
});

如果#file元素是应该触发更改事件的元素,则不要使用.delegate

$("#file").bind("change", function() {    
    $("#submit_form").trigger('click');
});

原因是委托处理程序放在应该触发事件的元素的祖先上。然后,您提供该元素的选择器。

页面上的事件冒泡。这意味着事件将从实际触发事件的元素传播到window,尝试在整个过程中触发每个元素的处理程序。

当到达绑定委托处理程序的祖先时,它将测试事件以查看最初触发事件的元素是否与选择器匹配。如果是这样,它将运行您的代码。如果没有,什么都不会发生。


jQuery 1.7或更高版本中执行事件委派的方法是使用on方法。

此方法允许您直接绑定到元素或为委派提供选择器。

所以对于代表团来说:

$("#file").on( "change", '.selector_of_element_to_watch', function() {
      // Run if a descendant of '#file' that matches the selector
      //    '.selector_of_element_to_watch' triggered the event
    $("#submit_form").trigger('click');
});

或直接绑定:

$("#file").on( "change", function() {
      // Run if '#file' itself, or ANY of its descendants triggered the event
    $("#submit_form").trigger('click');
});

(不知道元素#file的类型是什么,它可能不会/不能有后代。如果是这种情况,那么显然事件委派不是正确的解决方案。)< / em>的

bind / live / delegate 的旧API进行了大大改进,应该是从一开始就是如何完成的。