日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

簡析JavaScript事件、以及捕獲和冒泡

系統 2242 0

在瀏覽器文檔模型DOM中,事件是指因為某種具體的交互行為發生,由被作用的元素發出,再由瀏覽器響應的過程。常見的事件有:click,onmouseover,onblur等等。

?

DOM(文檔對象模型)結構是一個樹型結構,當一個HTML元素產生一個事件時,該事件會在元素結點與根結點之間的路徑傳播,路徑所經過的結點都會收到該事件,這個傳播過程可稱為DOM事件流。

按照DOM事件流的觀點,事件在樹中傳播的方向就有兩個,一個是從根結點向子結點流動,以及子結點向根結點傳播的方向。前者是Netscape Navigator對事件流的實現:捕獲型事件(Capturing),后者是IE的實現方式,即冒泡型事件(Bubbling)(下圖作者 小小子 )。

簡析JavaScript事件、以及捕獲和冒泡

DOM標準事件模型:

因為兩個不同的模型都有其優點和解釋,DOM標準支持捕獲型與冒泡型,可以說是它們兩者的結合體。它可以在一個DOM元素上綁定多個事件處理器,并且在處理函數內部,this關鍵字仍然指向被綁定的DOM元素,另外處理函數參數列表的第一個位置傳遞事件event對象。

首先是捕獲式傳遞事件,接著是冒泡式傳遞,所以,如果一個處理函數既注冊了捕獲型事件的監聽,又注冊冒泡型事件監聽,那么在DOM事件模型中它就會被調用兩次。

在注冊事件時主要有三種方法:

1.HTML掛載法。

    <div onclick=”alert(this.innerHTML);”>內容<div>
  
?

這是很普遍的做法,主要優點是方便,容易理解。但是最近有觀點認為這種方法對html的web語義產生了破壞,建議將事件注冊寫到js模塊中,從而將html與js分離。

2.js賦值法。

    element.onclick = function(){alert(this.innerHTML);}
  
?

注意:以上兩種方法只支持事件冒泡方式,不支持捕獲方式。

3.添加事件監聽方法。

    element.addEventListener(‘click’, observer, useCapture);
  
?

addEventListener方法接受三個參數。第一個參數是事件名稱,值得注意的是,這里事件名稱 與IE的不同,事件名稱是沒’on’開頭的 ;第二個參數observer是回調處理函數;第三個參數注明該處理回調函數是在事件傳遞過程中的捕獲階段被調用還是冒泡階段被調用,true表示注冊到捕獲階段,false表示注冊到冒泡階段。

移除已注冊的事件監聽器調用element的removeEventListener即可,參數不變.

    element.removeEventListener(‘click’, observer, useCapture);
  
?

?特別的,在IE中使用attachEvent方法來實現。

    element.attachEvent(‘onclick’, observer);
  
?

attachEvent接受兩個參數。第一個參數是事件名稱,第二個參數observer是回調處理函數。這里得說明一下,有個經常會出錯的地 方,IE下利用attachEvent注冊的處理函數調用時this指向不再是先前注冊事件的元素,這時的this為window對象了。 IE只支持事件注冊到冒泡階段。

要移除先前注冊的事件的監聽器,調用element的detachEvent方法即可,參數相同。

    element.detachEvent(‘onclick’, observer);?
  

事件注冊到不同階段的舉例,下面是典型的冒泡方式:

    <p onclick="javascript:alert('外面的p被點擊!')">
<input type="button" value="注冊到冒泡階段,點擊我查看效果" onclick="javascript:alert('里面的button被點擊!')"/>
</p>

  
?

?下面是注冊到冒泡階段的代碼,使用了addEventListener方法。注意addEventListener的第三個參數在這里是true,這意味 著將事件click注冊到了捕獲階段,也就是外面的p將先得到這個事件,然后才是內層的button。(以下例子請采用Firefox或chrome等非 ie瀏覽器測試)

    <p id="js_out2">
 <input type="button" id="js_in2" value="注冊到捕獲階段,點擊我查看效果"/>
</p>
<script type="text/javascript">
document.getElementById("js_out2").addEventListener('click', function(){alert('外面的div被點擊!');}, true);
document.getElementById("js_in2").addEventListener('click',function(){alert('里面的div被點擊!');},true);
</script>

  
?

再放兩個例子增加讀者對捕獲和冒泡的印象。

1. 冒泡事件和停止冒泡向上傳播的例子

簡析JavaScript事件、以及捕獲和冒泡

2. 捕獲事件并停止向下傳播的例子

簡析JavaScript事件、以及捕獲和冒泡

?

?

[ 轉自 : http://www.ilovespringna.com/?p=34023 ]

簡析JavaScript事件、以及捕獲和冒泡


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 巴彦县| 昭平县| 安达市| 景泰县| 安顺市| 通化市| 长丰县| 鹤山市| 项城市| 嫩江县| 昭通市| 清丰县| 象山县| 平泉县| 万年县| 南陵县| 桂东县| 呼伦贝尔市| 平谷区| 普安县| 云霄县| 姚安县| 嘉鱼县| 砚山县| 东乌珠穆沁旗| 南投市| 上高县| 油尖旺区| 舒兰市| 仁化县| 冷水江市| 贵定县| 陕西省| 永兴县| 阿巴嘎旗| 永新县| 舞阳县| 精河县| 剑川县| 法库县| 岑溪市|