jQuery事件模型默認(rèn)行為執(zhí)行順序及trigger()與 triggerHandler()比較實(shí)例分析
本文實(shí)例講述了jQuery事件模型默認(rèn)行為執(zhí)行順序及trigger()與 triggerHandler()比較。分享給大家供大家參考,具體如下:
前言:
最近在工作中做需求時(shí)發(fā)現(xiàn)了一個(gè)詭異的事情,在使用jQuery觸發(fā)事件時(shí),并不總是先執(zhí)行默認(rèn)行為,再執(zhí)行綁定的事件行為,有時(shí)候可能是相反的順序。于是上網(wǎng)查找了下資料,還真有個(gè)外國(guó)哥們和我遇到同一個(gè)問題!整理下筆記先~ ~
默認(rèn)行為執(zhí)行順序
一般來(lái)說(shuō),瀏覽器執(zhí)行事件的順序是:先執(zhí)行默認(rèn)行為再執(zhí)行綁定的行為。
可是在 jquery 中有些時(shí)候會(huì)出現(xiàn)相反的順序,先執(zhí)行綁定的行為,再執(zhí)行默認(rèn)行為。
那這里說(shuō)的“有些時(shí)候”到底是什么時(shí)候呢?
看下面的代碼示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>jQuery Trigger and Default Behavior Demo</title> <script type="text/javascript" src="jquery-1.3.2.js"></script> <script type="text/javascript"> // When the DOM is ready, initialize. $(function(){ $( "input" ).click( function( objEvent ){ // Alert the checkboxed status. alert( this.checked ); } ); $( "button" ).click( function( objEvent ){ // Trigger click on the checkbox. $( "input" ).click(); } ); }); </script> </head> <body> <h1> jQuery Trigger and Default Behavior Demo </h1> <form> <input type="checkbox" /> <button>click checkbox</button> </form> </body> </html>
說(shuō)明:頁(yè)面中有2個(gè)元素,一個(gè)是 input 元素,一個(gè)是button 元素,并分別綁定了click 事件。當(dāng)直接點(diǎn)擊 input 元素時(shí),alert結(jié)果為 true,input 的默認(rèn)行為是在綁定的 click 事件之前發(fā)生的;當(dāng)點(diǎn)擊 button 元素時(shí),alert結(jié)果卻變成了 false,input 的默認(rèn)行為是在綁定的 click 事件之后發(fā)生的;
細(xì)細(xì)體會(huì)其中的差別,發(fā)現(xiàn)當(dāng)調(diào)用JQuery 的 $(selector) .click( )
或者$(selector).trigger('click')
來(lái)觸發(fā) selector 元素的click事件時(shí), 默認(rèn)行為會(huì)在綁定的 click 事件之后發(fā)生。
那么如果我們希望,任何情況下默認(rèn)行為都在綁定的 click 事件之前發(fā)生怎么做呢?
最簡(jiǎn)單的方法就是在觸發(fā) input 元素的 click 事件之前,手動(dòng)設(shè)置 checkbox 的 checked
屬性,然后通過 triggerHandler()
來(lái)觸發(fā) click 事件(不觸發(fā)瀏覽器的默認(rèn)行為)。代碼如下所示:
$( "input" ).click( function( objEvent ){ // Alert the checkboxed status. alert( this.checked ); } ); $( "button" ).click( function( objEvent ){ // Toggle checkbox checked status. $( "input" )[ 0 ].checked = !$( "input" )[ 0 ].checked; // Trigger ONLY click event hanlders on the checkbox. $( "input" ).triggerHandler( "click" ); } );
jQuery中 trigger( ) 與 triggerHandler( ) 區(qū)別
共同點(diǎn):
-
都能觸發(fā)通過 jquery 綁定的事件處理函數(shù),如
.on()/.bind()/.click(function(){ })
這些方式; -
都能觸發(fā)原生元素對(duì)象上的
on{eventType}
綁定的事件處理函數(shù);
不同點(diǎn):
-
triggerHandler(‘event')
不會(huì)觸發(fā)原生元素對(duì)象上的.event()
方法(這種事件叫native event),而trigger(‘event')
則會(huì);
瀏覽器的默認(rèn)行為其實(shí)是執(zhí)行了原生元素對(duì)象上的.event()
方法?。?! -
.triggerHandler()
只會(huì)觸發(fā)第一個(gè)匹配的元素上的事件,而trigger()
會(huì)觸發(fā)所有匹配元素的事件; -
.triggerHandler()
觸發(fā)的事件不會(huì)冒泡,而trigger()
會(huì)冒泡; -
.triggerHandler()
返回值可以是任意值,如果沒有明確 return 值,則為undefined
,而.trigger()永遠(yuǎn)返回 jQuery object。所以使用.triggerHandler()時(shí)鏈?zhǔn)秸{(diào)用得自己實(shí)現(xiàn)。
使用 trigger( )與triggerHandler( )注意事項(xiàng)
有一次我用 trigger('click')
來(lái)觸發(fā)點(diǎn)擊事件時(shí),鼠標(biāo)并沒有改變位置,也就是說(shuō)鼠標(biāo)焦點(diǎn)沒有改變。測(cè)試了下發(fā)現(xiàn),trigger( )與triggerHandler( )觸發(fā)事件時(shí)并不會(huì)改變鼠標(biāo)焦點(diǎn),所以trigger('click')
方式觸發(fā)點(diǎn)擊事件這種方式,還是和用戶真正執(zhí)行點(diǎn)擊動(dòng)作是不同的。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于jQuery相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《jQuery頁(yè)面元素操作技巧匯總》、《jQuery常見事件用法與技巧總結(jié)》、《jQuery常用插件及用法總結(jié)》、《jQuery擴(kuò)展技巧總結(jié)》及《jquery選擇器用法總結(jié)》
希望本文所述對(duì)大家jQuery程序設(shè)計(jì)有所幫助。
- 淺談js在html中的加載執(zhí)行順序,多個(gè)jquery ready執(zhí)行順序
- 簡(jiǎn)述jQuery ajax的執(zhí)行順序
- jquery中ajax函數(shù)執(zhí)行順序問題之如何設(shè)置同步
- Jquery ajax執(zhí)行順序 返回自定義錯(cuò)誤信息(實(shí)例講解)
- jQuery中(function(){})()執(zhí)行順序的理解
- 如何確保JavaScript的執(zhí)行順序 之jQuery.html深度分析
- jquery $.ajax各個(gè)事件執(zhí)行順序
- jQuery中triggerHandler()方法用法實(shí)例
- jquery的trigger和triggerHandler的區(qū)別示例介紹
相關(guān)文章
EasyUI學(xué)習(xí)之Combobox下拉列表(1)
這篇文章主要為大家詳細(xì)介紹了EasyUI學(xué)習(xí)之Combobox下拉列表的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12JQuery實(shí)現(xiàn)Table的tr上移下移功能
這篇文章主要為大家詳細(xì)介紹了JQuery實(shí)現(xiàn)Table的tr上移下移功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02在jquery中combobox多選的不兼容問題總結(jié)
最近在IE10中開發(fā)jquery,關(guān)于jquery中combobox多選不能兼容的問題,進(jìn)行一些總結(jié),感興趣的朋友可以了解下2013-12-12JQuery實(shí)現(xiàn)表格動(dòng)態(tài)增加行并對(duì)新行添加事件
JQuery實(shí)現(xiàn)表格動(dòng)態(tài)增加行,一直保持最下面有多個(gè)空白行。這樣可以避免一次增加太多行可能導(dǎo)致頁(yè)面內(nèi)容太多,反應(yīng)變慢2014-07-07解決Jquery鼠標(biāo)經(jīng)過不停滑動(dòng)的問題
在鼠標(biāo)經(jīng)過的時(shí)候不停的顯示隱藏html元素,正確的寫法應(yīng)該是下面這樣的,需要的朋友可以參考下2014-03-03jQuery實(shí)現(xiàn)美觀的多級(jí)動(dòng)畫效果菜單代碼
這篇文章主要介紹了jQuery實(shí)現(xiàn)多級(jí)動(dòng)畫效果菜單代碼,涉及jquery針對(duì)頁(yè)面元素的遍歷及事件綁定操作頁(yè)面元素樣式變換的技巧,界面美觀實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09jquery+css3打造一款ajax分頁(yè)插件(自寫)
這篇文章主要介紹了自己寫的一款ajax分頁(yè)插件,用jquery+css3打造支持IE6+,但沒有動(dòng)畫效果,需要的朋友可以參考下2014-06-06Jquery高級(jí)應(yīng)用Deferred對(duì)象原理及使用實(shí)例
這篇文章主要介紹了Jquery高級(jí)應(yīng)用Deferred對(duì)象原理及使用實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05