我想在我的文件更改事件中使用委托功能,但我没有运气。这是我正在尝试做的事情:
$("#file").delegate("change", function() {
$("#submit_form").trigger('click');
});
我的更改活动没有被调用...我是否遗漏了某些内容或者我是否可以将委托用于更改事件?
答案 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进行了大大改进,应该是从一开始就是如何完成的。