2011-12-03 33 views
5

我想使用委託函數與我的文件更改事件,但我沒有任何運氣。這裏是我想要做的事:問題與jquery委託和更改事件

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

我改變事件不會得到所謂的......我思念的東西或我可以不改變事件中使用委託?

回答

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是的,它可能是它沒有/俊男繁衍後代如果是這樣的話,那麼很明顯,事件代表團不妥善解決。)

這是大爲改善在他們綁定/現場/委託的舊的API,並且應該是如何從一開始就做了。

+2

+1爲非常詳細的答案。 –