JS學(xué)習(xí)之事件對(duì)象

JS學(xué)習(xí)之事件對(duì)象理解

在觸發(fā)DOM上的某個(gè)事件時(shí),會(huì)創(chuàng)建一個(gè)event對(duì)象,該對(duì)象中包含著與事件相關(guān)的信息,包括事件的類型,導(dǎo)致事件的元素以其他的與事件有關(guān)的信息。

DOM中的事件對(duì)象

兼容DOM的瀏覽器會(huì)在事件觸發(fā)時(shí)傳一個(gè)event對(duì)象到事件處理程序中。不論指定事件處理程序時(shí)使用哪種方法(DOM0級(jí) 或者 DOM2級(jí))。

接下來(lái)我們看一個(gè)例子:

//假設(shè)有個(gè)按鈕,id為btn
<script>
var btn = document.getElementById("btn");
//DOM0級(jí)
btn.onclick = function (event)
{
    alert(event.type);  //"click"
}
//DOM2級(jí)
btn.addEventListener("click",function(event)
{
   alert(event.type);  //"click"
},false);
</script>

前面說(shuō)了event對(duì)象中包含著與事件有關(guān)的信息,那么,不可缺少的,event對(duì)象會(huì)有一些特定的屬性和方法。我們只介紹幾個(gè)常用的。

  • bubbles 表示事件是否冒泡
  • currentTarget 表示事件處理程序當(dāng)前正在處理事件的那個(gè)元素(簡(jiǎn)單來(lái)說(shuō),就是你把事件設(shè)置給的那個(gè)元素)
  • detail 與事件有關(guān)的詳細(xì)信息
  • eventPhase 表示事件所處的階段 1 表示事件捕獲 2 表示“處于目標(biāo)”階段 3 表示事件冒泡
  • target 事件的目標(biāo)
  • type 事件的類型

事件流:從頁(yè)面接收事件的順序
IE中的事件流叫做事件冒泡,即事件開(kāi)始時(shí)由最具體的元素(文檔中嵌套層次最深的元素)接收,逐級(jí)向上傳播到最不具體的節(jié)點(diǎn)(文檔)。
Netscape提出的一種事件流叫事件捕獲,即事件由最不具體的節(jié)點(diǎn)先接收,然后逐級(jí)向下,知道最具體的節(jié)點(diǎn)。
DOM2級(jí)事件 規(guī)定的事件流分為三個(gè)階段 :事件捕獲,處于目標(biāo),事件冒泡

在事件處理程序中,this的值始終等于currentTarget的值,而target的值為實(shí)際目標(biāo)。

<div id = "Div" class="Father">
        <div id = "son" class="Son">
            <input type = "number" value = "0" id = "Input" class="input">
        </div>
    </div>
    <script type="text/javascript">
        var div = document.getElementById("Div");
div.addEventListener("click",function(event)
        {
            alert(this === event.target);
        })
    </script>
1566032819(1).png

當(dāng)我們點(diǎn)擊最外面的div時(shí),結(jié)果顯示為true。當(dāng)點(diǎn)擊內(nèi)部的兩個(gè)div塊時(shí),結(jié)果均是顯示false.

這是因?yàn)?,正如上面所說(shuō),target 是事件的實(shí)際目標(biāo),而this 等于currentTarget。currentTarget的值是由事件處理程序的對(duì)象決定的,在這段代碼中,我們把onclick事件添加到最外面的div塊上面,因此,currentTarget的值為div (或者 document.getElementById("Div"))

也就是說(shuō),只有直接將事件處理程序指定給了目標(biāo)元素,則this, currentTarget, target的值相同

var btn = document.getElementById("btn");
btn.onclick = function(event)
{
    //省略代碼
}

IE中的事件對(duì)象

與在DOM中訪問(wèn)event對(duì)象不同,IE中訪問(wèn)event對(duì)象有幾種不同的方式,取決于指定事件處理程序的方式。當(dāng)通過(guò)DOM0級(jí)方式添加事件處理程序時(shí),event對(duì)象作為window對(duì)象的一個(gè)屬性存在。

var btn = document.getElementById("btn");
btn.onclick = function()
{
    var event = window.event;
    alert(event.type);    //"click"
}

IE中的事件處理函數(shù):attachEvent(),detachEvent();

當(dāng)使用attachEvent()來(lái)添加事件處理程序時(shí),則會(huì)有一個(gè)event對(duì)象作為參數(shù)被傳入事件處理函數(shù)中。當(dāng)然也可以用window對(duì)象來(lái)訪問(wèn)event對(duì)象。

btn.attachEvent("onclick",function(event)
{
    //省略代碼
});

可以看到這里我們的匿名函數(shù)是有一個(gè)參數(shù)的:event。此處要注意:attachEvent()函數(shù)第一個(gè)參數(shù)是onclick而不是click

IE中event對(duì)象的屬性和方法:

  • cancelBubble 默認(rèn)為false,設(shè)置為true即可取消事件冒泡(IE中不支持事件被捕獲,因此只能取消事件冒泡)
  • type 事件的類型
  • srcElement 事件的目標(biāo)(與DOM中的target相同)

注意:

  • 采用DOM0級(jí)添加事件,事件處理程序均是在其依附元素的作用域下運(yùn)行。
  • 對(duì)于DOM2級(jí)方式添加事件,DOM2級(jí)方法addEventListener(), removeEventListener()是在其依附元素的作用域中運(yùn)行,而對(duì)于IE來(lái)說(shuō),attachEvent(),detachEvent()是在全局作用域中運(yùn)行。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的。 ??事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,681評(píng)論 1 11
  • JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的。事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互瞬...
    LemonnYan閱讀 737評(píng)論 0 4
  • JavaScript 程序采用了異步事件驅(qū)動(dòng)編程模型。在這種程序設(shè)計(jì)風(fēng)格下,當(dāng)文檔、瀏覽器、元素或與之相關(guān)的對(duì)象發(fā)...
    劼哥stone閱讀 1,330評(píng)論 3 11
  • 聲明:本文來(lái)源于http://www.webzsky.com/?p=731我只是在這里作為自己的學(xué)習(xí)筆記整理一下(...
    angryyan閱讀 7,239評(píng)論 1 6
  • 事件流 JavaScript與HTML之間的交互是通過(guò)事件實(shí)現(xiàn)的。事件,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特定的交互...
    DHFE閱讀 909評(píng)論 0 3

友情鏈接更多精彩內(nèi)容