亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

歸納DOM事件中各種阻止方法

xioqua / 2404人閱讀

摘要:看以下例子事件具有事件傳播的效果,所以這里不會(huì)執(zhí)行第個(gè)事件第個(gè)事件第個(gè)事件具有阻止相同事件的其他偵聽器被調(diào)用的效果,所以這里不會(huì)執(zhí)行

前言

在復(fù)習(xí)事件這塊的時(shí)候,發(fā)現(xiàn)了一個(gè)問題,網(wǎng)上很多文章對(duì)事件阻止這塊解析的并不全面,并且有些文章也有錯(cuò)誤之處,于是想自己總結(jié)一下,也方便自己的復(fù)習(xí)。

知識(shí)預(yù)熱 事件冒泡和捕獲

在看本篇文章之前,需要了解事件的冒泡和捕獲,這里簡單介紹下
事件冒泡: 即事件開始時(shí)由最具體的元素(文檔中嵌套層數(shù)最深的那個(gè)點(diǎn))接收,然后逐級(jí)向上傳播到較為不具體的節(jié)點(diǎn)(文檔),可理解為:

由div->body->html->document 

事件捕獲:不太具體的節(jié)點(diǎn)應(yīng)該更早接收到事件,而最具體的節(jié)點(diǎn)應(yīng)該最后接收到事件,可理解為:

由document->html->body->div

DOM2級(jí)規(guī)定的事件流包括三個(gè)階段:事件捕獲階段、處于目標(biāo)階段、事件冒泡階段

dom事件綁定處理

與此同時(shí),我們還需要了解dom事件綁定處理的幾種方式

①、HTML事件處理(在dom元素中嵌入)

缺點(diǎn): 
1、this指向window
2、HTML與JS緊密耦合,改動(dòng)代碼麻煩

②、DOM0級(jí)事件處理(獲取dom元素直接綁定)

document.getElementById("btn").onclick = fn
優(yōu)點(diǎn): 
1、this指向dom元素
2、不存在瀏覽器兼容問題

③、DOM2級(jí)事件處理(事件監(jiān)聽)

document.getElementById("btn").addEventListener("click",fn)
優(yōu)點(diǎn): this指向dom元素 
缺點(diǎn): 1、需要對(duì)IE8及以下進(jìn)行兼容
document.getElementById("btn").attachEvent("click",fn)
由于IE8及以下只支持事件冒泡,所以通過attachEvent都會(huì)被添加到冒泡階段
IE中的attachEvent中的this總是指向全局對(duì)象Window
方法詳解 stopPropagation()
event.stopPropagation() 
作用: 終止事件在傳播過程的捕獲、目標(biāo)處理或起泡階段進(jìn)一步傳播

兼容:在IE<9的瀏覽器上使用 event.cancelBubble = true

preventDefault()
event.preventDefault() 
作用: 取消事件的默認(rèn)動(dòng)作
備注:只有cancelable屬性為true的事件,才可以使用preventDefault()
兼容:在IE瀏覽器中通過 e.returnValue = false
return false
return false
return在函數(shù)中有三個(gè)作用: 
1、用來返回一些值,當(dāng)然也可以不寫返回值
2、終止函數(shù)的執(zhí)行,就是說在return之后的代碼都不會(huì)執(zhí)行
3、在DOM0級(jí)事件中,可以像event.preventDefault() 取消默認(rèn)事件,但是在DOM2級(jí)則不行
stopImmediatePropagation()
event.stopImmediatePropagation()
作用: 阻止事件冒泡并且阻止相同事件的其他偵聽器被調(diào)用。

備注:阻止相同事件的其他偵聽器被調(diào)用指的是: 如果有多個(gè)相同類型事件的事件監(jiān)聽函數(shù)綁定到同一個(gè)元素,當(dāng)該類型的事件觸發(fā)時(shí),它們會(huì)按照被添加的順序執(zhí)行。如果其中某個(gè)監(jiān)聽函數(shù)執(zhí)行了 event.stopImmediatePropagation() 方法,則當(dāng)前元素剩下的監(jiān)聽函數(shù)將不會(huì)被執(zhí)行。

驗(yàn)證方法

接下來我們來驗(yàn)證一下,創(chuàng)建一個(gè)html文件,寫入如下代碼



    
    阻止默認(rèn)事件和冒泡
    
    



本次驗(yàn)證所監(jiān)聽的事件是

oncontextmenu

oncontextmenu 事件在元素中用戶右擊鼠標(biāo)時(shí)觸發(fā)并打開上下文菜單

由于一個(gè)個(gè)驗(yàn)證比較麻煩,這里把所有的代碼都寫出來

第一個(gè)是針對(duì)DOM0級(jí)事件的JS代碼

document.querySelector("div").oncontextmenu = function(event){
    event.stopImmediatePropagation();   // 可以阻止事件傳播
    event.stopPropagation();            // 可以阻止事件傳播
    event.preventDefault();             // 可以阻止默認(rèn)事件
    return false;                       // 可以阻止默認(rèn)事件
    console.log("dom0-div");  
};
document.oncontextmenu = function(event){
    event.preventDefault();             // 可以阻止默認(rèn)事件
    return false;                       // 可以阻止默認(rèn)事件
    console.log("dom0-document"); 
};

第二個(gè)是針對(duì)DOM2級(jí)事件的JS代碼

document.querySelector("div").addEventListener("contextmenu", function(event){
    event.stopImmediatePropagation();   // 可以阻止事件傳播
    event.stopPropagation();            // 可以阻止事件傳播
    event.preventDefault();             // 可以阻止默認(rèn)事件
    // return false;                    // 不能阻止默認(rèn)事件
    console.log("dom2-div")
});
document.addEventListener("contextmenu", function(event){
    event.preventDefault();             // 可以阻止默認(rèn)事件
    // return false;                    // 不能阻止默認(rèn)事件
    console.log("dom2-document")
});

驗(yàn)證是否可以成功阻止事件傳播
右擊div元素,控制臺(tái)查看是否有dom0-document 或者 dom2-document;
如果沒有,則阻止成功,如果有,則阻止失敗。
驗(yàn)證是否可以成功阻止默認(rèn)事件
右擊鼠標(biāo),看是否會(huì)出現(xiàn)菜單欄;
如果沒有,則阻止成功,如果有,則阻止失敗。

這里重點(diǎn)提一下 stopImmediatePropagation(),
這個(gè)方法除了阻止事件冒泡還可以阻止相同事件的其他偵聽器被調(diào)用。
看以下例子:

const div = document.querySelector("div");
        
document.addEventListener("click", (event) => {
    console.log("document事件");
    // event.stopImmediatePropagation()具有事件傳播的效果,所以這里不會(huì)執(zhí)行
});

div.addEventListener("click", (event) => {
    console.log("第1個(gè)事件");
});

div.addEventListener("click", (event) => {
    console.log("第2個(gè)事件");
    event.stopImmediatePropagation();
});

div.addEventListener("click", (event) => {
    console.log("第3個(gè)事件");
    // event.stopImmediatePropagation()具有阻止相同事件的其他偵聽器被調(diào)用的效果,所以這里不會(huì)執(zhí)行
});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102008.html

相關(guān)文章

  • Object of Event-Professional JavaScript for Web De

    在Nicholas C.Zakas《Professional JavaScript for Web Developer》一書中,對(duì)于解決event對(duì)象兼容性問題進(jìn)行了歸納封裝。 優(yōu)點(diǎn):無需過多考慮不同瀏覽器對(duì)event對(duì)象的差異,統(tǒng)一采用DOM標(biāo)準(zhǔn)調(diào)用event對(duì)象的方法和屬性 跨平臺(tái)的事件 1-創(chuàng)建Eventutil對(duì)象(工具包) var Eventutil=new Object(); ...

    104828720 評(píng)論0 收藏0
  • 整理DOM事件相關(guān)知識(shí)點(diǎn)

    摘要:事件相關(guān)內(nèi)容當(dāng)用戶與瀏覽器發(fā)生的一些交互時(shí)如果希望去獲得用戶行為就需要借助事件來完成事件部分內(nèi)容在中重要性不言而喻羅列需要了解與事件相關(guān)的知識(shí)如下這也是面試中遇到的問題事件的級(jí)別事件模型事件流事件處理程序描述事件捕獲冒泡的具體流程對(duì)象常見的 DOM事件相關(guān)內(nèi)容 當(dāng)用戶與瀏覽器發(fā)生的一些交互時(shí), 如果希望去獲得用戶行為, 就需要借助事件來完成. 事件部分內(nèi)容在 JS中重要性不言而喻. ...

    shenhualong 評(píng)論0 收藏0
  • 整理DOM事件相關(guān)知識(shí)點(diǎn)

    摘要:事件相關(guān)內(nèi)容當(dāng)用戶與瀏覽器發(fā)生的一些交互時(shí)如果希望去獲得用戶行為就需要借助事件來完成事件部分內(nèi)容在中重要性不言而喻羅列需要了解與事件相關(guān)的知識(shí)如下這也是面試中遇到的問題事件的級(jí)別事件模型事件流事件處理程序描述事件捕獲冒泡的具體流程對(duì)象常見的 DOM事件相關(guān)內(nèi)容 當(dāng)用戶與瀏覽器發(fā)生的一些交互時(shí), 如果希望去獲得用戶行為, 就需要借助事件來完成. 事件部分內(nèi)容在 JS中重要性不言而喻. ...

    red_bricks 評(píng)論0 收藏0
  • DOM 事件詳解

    摘要:與此同時(shí),我們獲得了回調(diào)函數(shù)的句柄,從而可以隨時(shí)從元素上移除相應(yīng)的事件監(jiān)聽。對(duì)象會(huì)被作為第一個(gè)參數(shù)傳遞給事件監(jiān)聽的回調(diào)函數(shù)。 Click、touch、load、drag、change、input、error、risize — 這些都是冗長的DOM(文檔對(duì)象模型)事件列表的一部分。事件可以在文檔(Document)結(jié)構(gòu)的任何部分被觸發(fā),觸發(fā)者可以是用戶操作,也可以是瀏覽器本身。事件并不是...

    tianhang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<