摘要:同樣是使用上面的示例,但這次我們給添加個(gè),一個(gè)是被所有共享的,另一個(gè)是獨(dú)有的,假設(shè)這兩個(gè)對(duì)當(dāng)前網(wǎng)站的功能很重要。登場(chǎng)他可以阻止事件冒泡并且阻止相同事件的其他偵聽(tīng)器被調(diào)用。
event事件對(duì)象有三種易混淆的方法,本文講述他們之間的區(qū)別:
Event.preventDefault()
Event.stopPropagation()
Event.stopImmediatePropagation()
綜述首先,我們看看他們?cè)贛DN上的介紹:
preventDefault: 如果當(dāng)前event.cancelable屬性為true,則取消的當(dāng)前事件的默認(rèn)動(dòng)作,但不阻止當(dāng)前事件的進(jìn)一步傳播
stopPropagation: 阻止當(dāng)前冒泡或捕獲階段的進(jìn)一步傳播
stopImmediatePropagation: 阻止調(diào)用相同事件的其他監(jiān)聽(tīng)器
Event.preventDefault我們來(lái)看一個(gè)代碼示例,當(dāng)點(diǎn)擊一個(gè)form中的submit按鈕時(shí)會(huì)將form提交處理,此時(shí)如果使用Event.preventDefault,就可以在點(diǎn)擊submit按鈕時(shí)避免表格提交。
$("#myForm").on("submit", function(e) { e.preventDefault(); // 什么都不會(huì)發(fā)生 });
Event.preventDefault能確保表格不會(huì)被提交,但他不能阻止來(lái)自冒泡階段的submit或點(diǎn)擊事件,其他兩種方法就是解決這個(gè)問(wèn)題的。
Event.stopPropagationstopPropagation 保證當(dāng)前事件不再進(jìn)一步冒泡,通過(guò)以下代碼示例說(shuō)明:
$(".container").on("click", function(e) { console.log("container 被點(diǎn)擊了"); }); $(".element").on("click", function(e) { e.preventDefault(); // 此時(shí)鏈接不會(huì)跳轉(zhuǎn) console.log("element 被點(diǎn)擊了"); });
此時(shí)點(diǎn)擊鏈接,console會(huì)顯示:
"element 被點(diǎn)擊了" "container 被點(diǎn)擊了"
這時(shí)如果添加Event.stopPropagation:
$(".container").on("click", function(e) { console.log("container 被點(diǎn)擊了"); }); $(".element").on("click", function(e) { e.preventDefault(); // 此時(shí)鏈接不會(huì)跳轉(zhuǎn) e.stopPropagation(); // 此時(shí)事件冒泡被阻止 console.log("element 被點(diǎn)擊了"); });
再次點(diǎn)擊鏈接,會(huì)看到:
"element 被點(diǎn)擊了"Event.stopImmediatePropagation
以上兩種方法已經(jīng)可以解決我們?cè)谑录幚碇?0%的問(wèn)題,接下來(lái)介紹一種無(wú)法解決情形。
同樣是使用上面的示例,但這次我們給添加2個(gè)class,一個(gè)是被所有共享的class: item,另一個(gè)是獨(dú)有的class: element,假設(shè)這兩個(gè)class對(duì)當(dāng)前網(wǎng)站的功能很重要。
我們首先使用之前提到的Event.stopPropagation
$(".element").on("click", function(e) { e.preventDefault(); // 此時(shí)鏈接不會(huì)跳轉(zhuǎn) e.stopPropagation(); // 此時(shí)事件冒泡被阻止 console.log("element 被點(diǎn)擊了"); }); $(".item").on("click", function(e) { console.log("item 被點(diǎn)擊了"); });
當(dāng)我們點(diǎn)擊時(shí),將會(huì)顯示:
"item 被點(diǎn)擊了" "element 被點(diǎn)擊了"
這個(gè)現(xiàn)象會(huì)發(fā)生是因?yàn)閕tem與element在DOM中是被平等對(duì)待的,與之前被點(diǎn)擊然后冒泡到父級(jí)div不同,這次我們點(diǎn)擊同時(shí)觸發(fā)了item與element的事件,此時(shí)使用stopPropagation無(wú)法阻止這種事件。
stopImmediatePropagation登場(chǎng)~
他可以阻止事件冒泡并且阻止相同事件的其他偵聽(tīng)器被調(diào)用。
$(".element").on("click", function(e) { e.preventDefault(); // 此時(shí)鏈接不會(huì)跳轉(zhuǎn) e.stopImmediatePropagation(); // item的點(diǎn)擊事件將被阻止 console.log("element 被點(diǎn)擊了"); }); $(".item").on("click", function(e) { console.log("item 被點(diǎn)擊了"); });
這里我們要注意的一點(diǎn)是:stopImmediatePropagation的代碼要盡量放到其他同級(jí)競(jìng)爭(zhēng)事件代碼的上面,如上面的例子中,為了使stopImmediatePropagation起作用,我們將element的事件監(jiān)聽(tīng)代碼放到了item之前!
運(yùn)行最后一例中的代碼,將只會(huì)看到:
"element 被點(diǎn)擊了"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93956.html
摘要:與之順序相反的是事件捕獲??梢岳斫鉃槭堑纳?jí)版,除了阻止冒泡,還能阻止結(jié)束掉當(dāng)前對(duì)象未執(zhí)行的其它綁定事件方法。作者以樂(lè)之名本文原創(chuàng),有不當(dāng)?shù)牡胤綒g迎指出。參考文章之間的區(qū)別 逛帖子的時(shí)候看到道友發(fā)的前端面試題, preventDefault(), stopPropagation(), return false三者的區(qū)別 這三者的使用想必大家并不陌生,但是細(xì)想之下還是有可究之處。 pre...
摘要:如圖使用事件捕獲模式注冊(cè)事件監(jiān)聽(tīng)對(duì)最外層,中間層,最內(nèi)層分別用捕獲模式注冊(cè)事件監(jiān)聽(tīng),我們上面說(shuō)了,如果使用捕獲模式,那么第三個(gè)參數(shù)應(yīng)該是,否則則是冒泡模式,如果不聲明,默認(rèn)為冒泡模式。 來(lái)源: 個(gè)人博客 想必好多童鞋都有直接復(fù)制粘貼event.preventDefault() 或者event.stopPropagation() 的經(jīng)歷,但是為什么這樣做不甚了解,今天我們的目的就是要徹...
摘要:取消默認(rèn)操作,如標(biāo)簽的,時(shí)會(huì)觸發(fā),有時(shí)需要取消默認(rèn)操作。停止冒泡,的事件流和的事件流類(lèi)似。是頂層元素分發(fā),底層元素,由頂層往上事件傳遞,叫冒泡。停止冒泡用等同于參考文章之間的區(qū)別 1. preventDefault 取消默認(rèn)操作,如a標(biāo)簽的href,click時(shí)會(huì)觸發(fā),有時(shí)需要取消默認(rèn)操作。 2. stopPropagation 停止冒泡,dom的事件流和android的事件流類(lèi)似。a...
摘要:簡(jiǎn)單的門(mén)面模式實(shí)例事件綁定函數(shù)門(mén)面模式的作用是將復(fù)雜的接口進(jìn)行包裝,變成一個(gè)便于使用的接口。還是以事件相關(guān)為例,事件綁定中還有兩個(gè)常用的分別是和。 門(mén)面模式是什么,與其我去用笨拙的語(yǔ)言去解釋?zhuān)蝗缈聪旅孢@張圖,曾經(jīng)在網(wǎng)上很火的一張圖片,說(shuō)的是一位兒子為他的爸媽設(shè)置的電腦桌面。 showImg(http://segmentfault.com/img/bVcgHm); 有了這些起好名字...
摘要:在用戶拖拽文件到瀏覽器的某個(gè)元素上時(shí),可以監(jiān)聽(tīng)到與拖拽相關(guān)的事件,并對(duì)拖拽結(jié)果進(jìn)行處理,本文討論下和拖拽文件相關(guān)的一些問(wèn)題,不過(guò)沒(méi)有處理太多關(guān)于兼容性的問(wèn)題。其中,與拖拽文件相關(guān)的事件有文件拖拽進(jìn)文件拖拽在懸浮文件拖拽離開(kāi)文件拖拽放下。 在用戶拖拽文件到瀏覽器的某個(gè)元素上時(shí),js可以監(jiān)聽(tīng)到與拖拽相關(guān)的事件,并對(duì)拖拽結(jié)果進(jìn)行處理,本文討論下和拖拽文件相關(guān)的一些問(wèn)題,不過(guò)沒(méi)有處理太多關(guān)于兼...
閱讀 2027·2023-04-25 22:50
閱讀 2840·2021-09-29 09:35
閱讀 3393·2021-07-29 10:20
閱讀 3162·2019-08-29 13:57
閱讀 3363·2019-08-29 13:50
閱讀 3038·2019-08-26 12:10
閱讀 3534·2019-08-23 18:41
閱讀 2639·2019-08-23 18:01