[英]Why jQuery triggerHandler() works but trigger() doesn't?
使用triggerHandler()
單擊一個元素:
$element = $('#gwt-debug-location-pill-edit-div:visible');
$element.triggerHandler('click');
但是,使用trigger()
單擊它不會:
$element.trigger('click');
這是為什么?
要復制它(在Firefox和Chrome中):
->
關鍵字規划師 讓我們比較jQuery.fn.trigger
和jQuery.fn.triggerHandler
:
trigger: function( type, data ) {
return this.each(function() {
jQuery.event.trigger( type, data, this );
});
},
triggerHandler: function( type, data ) {
var elem = this[0];
if ( elem ) {
return jQuery.event.trigger( type, data, elem, true );
}
}
唯一真正的區別是第四個參數, true
,給jQuery.event.trigger
和triggerHandler
。
查看jQuery.event.trigger
, 該參數被稱為onlyHandlers
,除其他外, triggerHandler
的文檔指出:
- .triggerHandler()方法不會導致事件的默認行為(例如表單提交)。
我們可以看到實際觸發默認行為的位置 :
// If nobody prevented the default action, do it now
if ( !onlyHandlers && !event.isDefaultPrevented() ) {
如果onlyHandlers
為false( trigger()
),並且沒有事件處理程序停止執行默認事件,則將執行默認操作。
如果onlyHandlers
為true( triggerHandler()
),則永遠不會發生這種情況。
因此,對於trigger()
情況,它最終會在目標元素上執行click()
,這會正確觸發狀態更改 - 但事實證明,在trigger()
和triggerHandler()
情況下,點擊已經是 通過上面的eventPath在循環中正確啟動:
// Native handler
handle = ontype && cur[ ontype ];
if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
所以trigger('click')
最后點擊兩次元素(!) - 可能是因為click()
沒有返回false,所以從不阻止事件默認操作 - 而triggerHandler('click')
只執行一次。
這可以通過使用檢查器逐步執行jQuery.event.trigger
方法並查看選擇器打開然后再次關閉來驗證。
問題是這是否是我們通常所期望的; 看起來奇怪的是,在僅有DOM反應的情況下,否則工作的事件觸發器會導致雙觸發器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.