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