成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript事件探秘

shuibo / 2064人閱讀

摘要:一事件流事件流描述的是從頁面中接受事件的順序。級事件處理程序級事件定義了兩個方法用于處理指定和刪除事件處理程序的操作和。第二個方法是,它返回事件的目標。第三個方法是,用于取消事件的默認行為。首先嘗試使用方法阻止事件流,否則就使用屬性。

一、事件流

事件流描述的是從頁面中接受事件的順序。
IE的事件流是事件冒泡流,而Netscape的事件流是事件捕獲流

1、事件冒泡

事件冒泡,即事件最開始由最具體的元素(文檔中嵌套層次最深的那個節(jié)點)接收,然后逐級向上轉(zhuǎn)播至最不具體的節(jié)點(文檔)。
如下圖所示,如果你點擊了按鈕,那么也認為你點擊了外面的div,最終會一直傳遞到document上,從小到大的傳播,就好比水里魚的冒泡,從小泡泡大道泡泡的過程。

2、事件捕獲

事件捕獲跟事件冒泡恰好相反。它的思想是不太具體的節(jié)點應(yīng)該更早接收到事件,而最具體的節(jié)點最后接收到事件。

3、事件的三個階段

事件的三個階段分別是:捕獲階段、目標階段、冒泡階段

二、事件處理程序 1、HTML事件處理程序

所謂的HTML事件是指把JS直接寫在HTML元素中,比如下面的代碼:
[程序1]




    
    事件流


    

或者
[程序2]




    
    事件流


    

那么HTML事件處理程序有一種很明顯的缺點:HTML與JS代碼緊密的耦合在一起,這不是這一種好的程序設(shè)計。

2、DOM0級事件處理程序

DOM0級別事件處理程序是一種比較傳統(tǒng)的,是指把一個行數(shù)賦值給一個事件處理程序的屬性,也是用的比較多的方式。
他的優(yōu)點是:簡單,而且具有夸瀏覽器的優(yōu)勢。
[程序3]


var btn2 = document.getElementById("btn2");
btn2.onclick = function(){
     alert("這是通過DOM0級添加的事件!");
}

如果要需要這個事件,可以這樣寫:
[程序4]

btn2.onclick = null;

以上就是DOM0級事件處理方法。

3、DOM2級事件處理程序

DOM2級事件定義了兩個方法:用于處理指定和刪除事件處理程序的操作:addEventListener()和removeEventListener()。它們都接收三個參數(shù):要處理的事件名、作為事件處理程序的函數(shù)和一個布爾值。
他的有點與DOM0級一樣,還可以添加多個事件處理程序。
[程序5]

但是,在IE8-的瀏覽器中無法運行,不支持addEventListener,IE有IE獨有的DOM2級事件處理程序。(IE11親測可以,IE9、10沒測試過)。

4、IE事件處理程序

在IE中也提供了類似的兩個方法
attachEvent()添加事件
detachEvent()刪除事件
這兩個方法接收相同的兩個參數(shù):事件處理程序名稱與事件處理函數(shù)
[程序6]

btn3.attachEvent("onclick",showMsg);

這這里又要給事件加上“on”,這與DOM2級事件處理程序想法。那么這就夸瀏覽器了。
那么怎么解決跨瀏覽器的問題?答案是,能力判斷,即你支持attachEvent()的能力就給你這個,你有別的能力你就你其他的能力。

5、跨瀏覽器的事件處理程序

我們封裝到一個對象
[程序7]

var eventUtil = {
    //添加句柄
    addHandle:function(element,type,handle){
        if (element.addEventListener) {
            element.addEventListener(type,handle,false);
        }else if(element.attachEvent){
            element.attachEvent("on"+type,handle);
        }else{
            element["on"+type] = handle;
        };
    },
    //刪除句柄
    removeHandle:function(element,type,handle){
        if (element.removeEventListener) {
            element.removeEventListener(type,handle,false);
        }else if(element.dettachEvent){
            element.dettachEvent("on"+type,handle);
        }else{
            element["on"+type] = null;
        };
    }
}
//調(diào)用
eventUtil.addHandle(btn3,"click",showMsg);

這樣一來,IE和Chrome都能很好的支持了。

三、事件對象

事件對象event

1、DOM中的事件對象

(1)、type:獲取事件類型
[程序8]

function showMsg(event){
    alert(event.type);    //click
}

(2)、target:事件目標
[程序9]

function showMsg(event){
    alert(event.target.nodeName);    //input
}

(3)、stopPropagation() 阻止事件冒泡
我們已經(jīng)知道了事件冒泡的概念,那么,當我點擊按鈕的時候我就是點擊按鈕,不讓它再冒泡到div上了,那么我們可以在程序中加上
event.stopPropagation() 即可阻止事件的冒泡。
(4)、preventDefault() 阻止事件的默認行為
事件的默認行為,比如,跳轉(zhuǎn),他的默認行為就是跳轉(zhuǎn)到某個鏈接,那么現(xiàn)在我們想要點擊它不讓它跳轉(zhuǎn),去執(zhí)行我們給他的事件行為。那么可以這樣寫:
event.preventDefault()

2、IE中的事件對象

(1)、type:獲取事件類型
(2)、srcElement:事件目標
(3)、cancelBubble=true阻止事件冒泡
(4)、returnValue=false阻止事件的默認行為
[程序10]




    
    事件
    


    跳轉(zhuǎn)
    

3、夸瀏覽器的事件對象

雖然 DOM 和 IE 中的 event 對象不同,但基于它們之間的相似性依舊可以拿出跨瀏覽器的方案來。IE 中 event 對象的全部信息和方法 DOM 對象中都有,只不過實現(xiàn)方式不一樣。不過,這種對應(yīng)關(guān)系讓實現(xiàn)兩種事件模型之間的映射非常容易??梢詫η懊娼榻B的 EventUtil 對象加以增強,添加如下方法以求同存異。

getEvent: function(event){
    return event ? event : window.event;
},
getTarget: function(event){
    return event.target || event.srcElement;
},
preventDefault: function(event){
   if (event.preventDefault){
       event.preventDefault();
   } else {
       event.returnValue = false;
   }
},
stopPropagation: function(event){
    if (event.stopPropagation){
        event.stopPropagation();
    } else {
        event.cancelBubble = true;
    }
}

第一個是 getEvent(),它返回對 event對象的引用,在兼容 DOM 的瀏覽器中, event 變量只是簡單地傳入和返回。而在 IE 中, event 參數(shù)是未定義的(undefined),因此就會返回 window.event。

第二個方法是 getTarget(),它返回事件的目標。在這個方法內(nèi)部,會檢測 event 對象的 target屬性,如果存在則返回該屬性的值;否則,返回 srcElement 屬性的值。

第三個方法是 preventDefault(),用于取消事件的默認行為。在傳入 event 對象后,這個方法會檢查是否存在preventDefault()方法,如果存在則調(diào)用該方法。如果 preventDefault()方法不存在,則將 returnValue 設(shè)置為 false。

第四個方法是 stopPropagation(),其實現(xiàn)方式類似。首先嘗試使用 DOM 方法阻止事件流,否則就使用 cancelBubble 屬性。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78827.html

相關(guān)文章

  • DomTree探秘

    摘要:是的實例化對象,是的子類,以此類推總結(jié)的目的是使用操作刪除添加替換創(chuàng)建事件樹狀的文檔而提供的一個編程接口節(jié)點對象類型這些屬性是常量,是用來聲明某一節(jié)點的類型。如同語言中的等,而且它們也有構(gòu)造函數(shù)啊構(gòu)造函數(shù)類型 DomTree DOM DOM是一個由javascript節(jié)點對象組成的層次結(jié)構(gòu)/樹 HTML 使用chrome打開,并打開開發(fā)者工具,選擇Elements-...

    yankeys 評論0 收藏0
  • 自定義元素探秘及構(gòu)建可復(fù)用組件最佳實踐

    摘要:若自定義元素標簽名稱不可用則摒棄??傊远x元素讓開發(fā)者的代碼更易理解和維護,并分割為小型,可復(fù)用及可封裝的模塊。被稱為自定義元素接口,雖然現(xiàn)在仍然可用,但是已經(jīng)被棄用并被認為是糟糕的實現(xiàn)。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 這是 JavaScript 工作原理第十九章。 概述 在 前述文章中,我們介紹了 Shadow ...

    CoorChice 評論0 收藏0
  • JavaScript 工作原理之十二-網(wǎng)絡(luò)層探秘及如何提高其性能和安全性

    摘要:為了更加高效的網(wǎng)絡(luò)層,它需要不僅僅只是扮演套接字管理員的角色。用套接字池來組織套接字,以源來分組套接字,每個套接字池強制限制其連接數(shù)和安全約束。協(xié)商是一個為計算機網(wǎng)絡(luò)提供通信安全的加密協(xié)議。 原文請查閱這里,略有改動,本文采用知識共享署名 4.0 國際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請查閱這里。 這是 JavaScript 工作原理的第十二章...

    LoftySoul 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<