最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

帶你快速理解javascript中的事件模型

 更新時(shí)間:2017年08月14日 14:31:09   作者:泛舟青煙  
這篇文章主要介紹了javascript中的事件模型,其中包括了DOM0級(jí)事件模型和DOM2級(jí)事件模型(事件捕獲和事件冒泡和DOM2級(jí)的注冊(cè)事件和解除事件),需要的朋友可以參考下

javascript中有兩種事件模型:DOM0,DOM2。而對(duì)于這兩種的時(shí)間模型,我一直不是非常的清楚,現(xiàn)在通過(guò)網(wǎng)上查閱資料終于明白了一些。

  一.  DOM0級(jí)事件模型

  DOM0級(jí)事件模型是早期的事件模型,所有的瀏覽器都是支持的,而且其實(shí)現(xiàn)也是比較簡(jiǎn)單。代碼如下:

<p id = 'click'>click me</p>
<script>
 document.getElementById('click').onclick = function(event){
  alert(event.target);
 }
</script>

  這種事件模型就是直接在dom對(duì)象上注冊(cè)事件名稱,這段代碼就是在p標(biāo)簽上注冊(cè)了一個(gè)onclick事件,在這個(gè)事件函數(shù)內(nèi)部輸出點(diǎn)擊的目標(biāo)。而解除事件則更加簡(jiǎn)單,就是將null復(fù)制給事件函數(shù),如下:

document.getElementById('click'_).onclick = null;
  由此我們可以知道dom0中,一個(gè)dom對(duì)象只能注冊(cè)一個(gè)同類型的函數(shù),因?yàn)樽?cè)多個(gè)同類型的函數(shù)的話,就會(huì)發(fā)生覆蓋,之前注冊(cè)的函數(shù)就會(huì)無(wú)效。

var click = document.getElementById('click');
click.onclick = function(){
 alert('you click the first function');
};
click.onclick = function(){
 alert('you click the second function')
}

  在這段代碼中,我們?yōu)閐om對(duì)象注冊(cè)了兩個(gè)onclick函數(shù),但是結(jié)果是只執(zhí)行了第二個(gè)注冊(cè)的函數(shù),前面所注冊(cè)的函數(shù)被覆蓋了。

  二.   DOM2級(jí)事件模型

  1.  事件捕獲和事件冒泡(capture,bubble)

  首先,IE8及以下是不支持這種事件模型的。事件捕獲和事件冒泡的機(jī)制如下圖:

  如上圖所示,123代表事件捕獲,4567代表事件冒泡。首先我們使用下面的代碼:

<div id = 'outer' style = 'margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;'>
 <div id="inner" style = 'margin-left:20px; width: 50px;height:50px; background: green;'></div>
</div>


  假設(shè)我們點(diǎn)擊了ID為inner的div,那么此時(shí)的事件流程就是,首先執(zhí)行捕獲階段:document-html-body-div(outer)。然后執(zhí)行冒泡階段:div(inner)-div(outer)-body-html-document。

  2.   DOM2級(jí)的注冊(cè)事件和解除事件

  在DOM2級(jí)中使用addEventListener和removeEventListener來(lái)注冊(cè)和解除事件(IE8及之前版本不支持)。這種函數(shù)較之之前的方法好處是一個(gè)dom對(duì)象可以注冊(cè)多個(gè)相同類型的事件,不會(huì)發(fā)生事件的覆蓋,會(huì)依次的執(zhí)行各個(gè)事件函數(shù)。

  addEventListener('事件名稱','事件回調(diào)','捕獲/冒泡')。示例如下:

<div id = 'outer' style = 'margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;'>
 <div id="inner" style = 'margin-left:20px; width: 50px;height:50px; background: green;'></div>
</div>
<script>
 var click = document.getElementById('inner');
 click.addEventListener('click',function(){
  alert('click one');
 },false);
 click.addEventListener('click',function(){
  alert('click two');
 },false);
</script>

  首先我們要知道addEventListenr的第一個(gè)參數(shù)是事件名稱,與DOM0級(jí)不同的是沒(méi)有”on“,另外第三個(gè)參數(shù)代表捕獲還是冒泡,true代表捕獲事件,false代表冒泡事件。

  而在這段代碼中,我們?yōu)閕nner的div注冊(cè)了兩個(gè)click事件函數(shù),結(jié)果是瀏覽器會(huì)依次執(zhí)行這兩個(gè)函數(shù)。
  下面我們演示如何使用事件流的發(fā)生機(jī)制。

<div id = 'outer' style = 'margin: 100px 0 0 100px; width: 200px;height: 200px; background: red;'>
 <div id="inner" style = 'margin-left:20px; width: 50px;height:50px; background: green;'></div>
</div>
<script>
 var click = document.getElementById('inner');
 var clickouter = document.getElementById('outer');
 click.addEventListener('click',function(){
  alert('inner show');
 },true);
 clickouter.addEventListener('click',function(){
  alert('outer show');
 },true);
</script>

  這段代碼,我們使用了捕獲事件,由于inner是嵌套在outer中的,所以我們知道當(dāng)使用捕獲的時(shí)候outer是應(yīng)該首先捕獲到這個(gè)事件的,其次inner才能捕獲到這個(gè)事件。那么結(jié)果就是outer首先執(zhí)行,其次是inner執(zhí)行。

  那么我把outer的執(zhí)行時(shí)機(jī)改為冒泡的階段呢?

alickouter.addEventListener('click',function(){
 alert('outer show'); 
},false);

  這種情況下,就是先執(zhí)行inner后執(zhí)行outer了。同理我們把二者的事件執(zhí)行時(shí)機(jī)都改為冒泡階段的話,依舊是先執(zhí)行inner后執(zhí)行outer。那么還有個(gè)問(wèn)題,就是如果我們把inner注冊(cè)兩個(gè)click事件,一個(gè)是在捕獲階段,另一個(gè)是在冒泡階段,也就是說(shuō)把a(bǔ)ddEventListenter的第三個(gè)參數(shù)分別設(shè)置為false和true,那么執(zhí)行的順序又是怎樣的呢。

<script>
 var click = document.getElementById('inner');
 var clickouter = document.getElementById('outer');
 click.addEventListener('click',function(){
  alert('capture show');
 },true);
 click.addEventListener('click',function(){
  alert('bubble show');
 },false);
</script>

  這種情況下首先這些的是capture show,其次是bubble show。但是這種結(jié)果是與注冊(cè)的順序有關(guān)系的,先注冊(cè)就先執(zhí)行。因?yàn)槲覀冊(cè)诳词录东@和事件冒泡示意圖,發(fā)現(xiàn)最后具體的dom對(duì)象是只有一個(gè)的。

  那么 如果我們給outer和inner都注冊(cè)了click事件但是我不希望outer執(zhí)行怎么辦呢?這個(gè)時(shí)候我們就需要用到stopPropagation函數(shù)了,這個(gè)函數(shù)是用來(lái)阻止冒泡,言下之意是讓事件不再繼續(xù)冒泡下去,這樣接下來(lái)注冊(cè)同樣類型事件的dom對(duì)象就不會(huì)執(zhí)行了。

比如在自制下拉框的時(shí)候,我們點(diǎn)擊瀏覽器的其他位置,我們需要下拉框的options隱藏,這時(shí)我們就要用到stopPropagation了。如下:

<script>
 var click = document.getElementById('inner');
 var clickouter = document.getElementById('outer');
 click.addEventListener('click',function(event){
  alert('inner show');
  event.stopPropagation();
 },false);
 clickouter.addEventListener('click',function(){
  alert('outer show');
 },false);
</script>

  正常的情況下,我們?cè)诓惶砑觭topPropagation函數(shù)時(shí),首先應(yīng)該執(zhí)行inner,然后執(zhí)行outer,但是當(dāng)我們?cè)趇nner的事件函數(shù)中添加了stopPropagation函數(shù)之后,執(zhí)行完inner的事件函數(shù)之后,就不會(huì)在執(zhí)行outer的事件函數(shù)了,也可以理解為事件冒泡到inner之后就消失了,因此也就不會(huì)在執(zhí)行接下來(lái)的事件函數(shù)了。

  由于事件捕獲階段沒(méi)有可以阻止事件的函數(shù),所以一般都是設(shè)置為事件冒泡。

好了以上就是全部?jī)?nèi)容啦 ,希望對(duì)大家的學(xué)習(xí)有所幫助~~

相關(guān)文章

  • JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹詳解

    JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹詳解

    這篇文章主要介紹了JavaScript數(shù)據(jù)結(jié)構(gòu)和算法之二叉樹詳解,本文講解了二叉樹的概念、二叉樹的特點(diǎn)、二叉樹節(jié)點(diǎn)的定義、查找最大和最小值等內(nèi)容,需要的朋友可以參考下
    2015-02-02
  • JavaScript常用字符串與數(shù)組擴(kuò)展函數(shù)小結(jié)

    JavaScript常用字符串與數(shù)組擴(kuò)展函數(shù)小結(jié)

    這篇文章主要介紹了一些JavaScript常用字符串與數(shù)組擴(kuò)展函數(shù),整理了一些簡(jiǎn)單而使用率又高的操作String與Array的函數(shù),需要的朋友可以參考下
    2016-04-04
  • javaScript復(fù)制功能調(diào)用實(shí)現(xiàn)方案

    javaScript復(fù)制功能調(diào)用實(shí)現(xiàn)方案

    說(shuō)到使用js實(shí)現(xiàn)點(diǎn)擊復(fù)制的功能,我下面想說(shuō)的方法也是和網(wǎng)上的大同小異的。js實(shí)現(xiàn)是很簡(jiǎn)單,最難的是兼容問(wèn)題,畢竟用IE以外的人還是有很多的
    2012-12-12
  • javascript基礎(chǔ)語(yǔ)法——全面理解變量和標(biāo)識(shí)符

    javascript基礎(chǔ)語(yǔ)法——全面理解變量和標(biāo)識(shí)符

    下面小編就為大家?guī)?lái)一篇javascript基礎(chǔ)語(yǔ)法——全面理解變量和標(biāo)識(shí)符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • javascript學(xué)習(xí)指南之回調(diào)問(wèn)題

    javascript學(xué)習(xí)指南之回調(diào)問(wèn)題

    回調(diào)函數(shù)被認(rèn)為是一種高級(jí)函數(shù),一種被作為參數(shù)傳遞給另一個(gè)函數(shù)(在這稱作"otherFunction")的高級(jí)函數(shù),回調(diào)函數(shù)會(huì)在otherFunction內(nèi)被調(diào)用(或執(zhí)行)。回調(diào)函數(shù)的本質(zhì)是一種模式(一種解決常見(jiàn)問(wèn)題的模式),因此回調(diào)函數(shù)也被稱為回調(diào)模式。
    2016-04-04
  • JavaScript Switch 聲明

    JavaScript Switch 聲明

    JavaScript Switch 聲明...
    2007-04-04
  • 淺談關(guān)于JavaScript API設(shè)計(jì)的一些建議和準(zhǔn)則

    淺談關(guān)于JavaScript API設(shè)計(jì)的一些建議和準(zhǔn)則

    這篇文章主要介紹了淺談關(guān)于JavaScript API設(shè)計(jì)的一些建議和準(zhǔn)則,文中列舉了許多知名的JS API進(jìn)行輔助說(shuō)明,極力推薦!需要的朋友可以參考下
    2015-06-06
  • 處理及遍歷XML文檔DOM元素屬性及方法整理

    處理及遍歷XML文檔DOM元素屬性及方法整理

    本文整理了一些用于處理及遍歷XML文檔的DOM元素屬性與方法及動(dòng)態(tài)創(chuàng)建內(nèi)容時(shí)所用的W3C DOM屬性和方法,有需求的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • JavaScript中判斷對(duì)象類型的幾種方法總結(jié)

    JavaScript中判斷對(duì)象類型的幾種方法總結(jié)

    本篇文章是對(duì)JavaScript中判斷對(duì)象類型的幾種方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-11-11
  • JavaScript 基礎(chǔ)問(wèn)答一

    JavaScript 基礎(chǔ)問(wèn)答一

    今天在網(wǎng)上看到了一份很不錯(cuò)的JavaScript FAQ,由于擔(dān)心自己并不能一直把它讀完,所以就嘗試翻譯一些內(nèi)容,和朋友們一起分享。
    2008-12-12

最新評(píng)論

沿河| 罗定市| 海淀区| 巴南区| 灵石县| 额尔古纳市| 宁阳县| 乐至县| 花莲县| 永善县| 洛浦县| 依兰县| 岳西县| 民勤县| 平谷区| 宣汉县| 合江县| 荥经县| 辽中县| 平定县| 新乡县| 陕西省| 双流县| 库车县| 金寨县| 喀喇| 车致| 得荣县| 姚安县| 始兴县| 双柏县| 格尔木市| 察雅县| 新巴尔虎右旗| 安达市| 宽城| 通化市| 香港| 太仆寺旗| 景谷| 福建省|