摘要:是一個(gè)由可以接收事件的對(duì)象實(shí)現(xiàn)的接口,并且可以為它們創(chuàng)建偵聽器。方法節(jié)在上注冊(cè)特定事件類型的事件處理程序。將事件分派到此。代碼的其他方法節(jié)擴(kuò)展,供實(shí)現(xiàn)的事件目標(biāo)使用以實(shí)現(xiàn)屬性。級(jí)中是一般化的變動(dòng)事件。
EventTarget
EventTarget是一個(gè)由可以接收事件的對(duì)象實(shí)現(xiàn)的接口,并且可以為它們創(chuàng)建偵聽器。
Element,document 和 window 是最常見的事件目標(biāo),但是其他對(duì)象也可以是事件目標(biāo),比如XMLHttpRequest,AudioNode,AudioContext 等等。
許多事件目標(biāo)(包括元素,文檔和 window)還支持通過(guò) on... 屬性和屬性設(shè)置事件處理程序。
構(gòu)造函數(shù)節(jié)EventTarget()
創(chuàng)建一個(gè)新的 EventTarget 對(duì)象實(shí)例。
方法節(jié)EventTarget.addEventListener()
在EventTarget上注冊(cè)特定事件類型的事件處理程序。
EventTarget.removeEventListener()
EventTarget中刪除事件偵聽器。
EventTarget.dispatchEvent()
將事件分派到此EventTarget。
Mozilla chrome 代碼的其他方法節(jié)Mozilla擴(kuò)展,供JS實(shí)現(xiàn)的事件目標(biāo)使用以 實(shí)現(xiàn) on* 屬性。另見 WebIDL bindings 綁定。
void setEventHandler(DOMString type, EventHandler handler)
EventHandler getEventHandler(DOMString type)
示例節(jié) EventTarget 的簡(jiǎn)單實(shí)現(xiàn)節(jié)function EventTarget() { this.listeners = {}; } Object.assign(EventTarget.prototype, { // listeners: null, // prefix:"on", addEventListener: function (type, callback) { if (!(type in this.listeners)) { this.listeners[type] = []; } this.listeners[type].push(callback); }, removeEventListener: function (type, callback) { if (type in this.listeners) { let stack = this.listeners[type]; let index = stack.indexOf(callback); console.log(index); //可能會(huì)添加多個(gè) while (index !== -1) { stack.splice(index, 1); index = stack.indexOf(callback); } } }, dispatchEvent: function (event) { if (event.type in this.listeners) { let stack = this.listeners[event.type]; event.target = this; stack.forEach(callback => { callback.call(this,event); }) } } }); let target = new EventTarget(); let remove = (e) => {console.log(e)}; target.addEventListener("test",remove); target.addEventListener("test",remove); target.addEventListener("test",(e) => {console.log(e)}); target.removeEventListener("test",remove); target.dispatchEvent({type:"test"});
當(dāng)單擊這個(gè)例子中的按鈕時(shí), this 和 currentTarget 都等于 document.body,因?yàn)槭录幚沓?序是注冊(cè)到這個(gè)元素上的。然而, target 元素卻等于按鈕元素,因?yàn)樗?click 事件真正的目標(biāo)。由 于按鈕上并沒有注冊(cè)事件處理程序,結(jié)果 click 事件就冒泡到了 document.body,在那里事件才得到 了處理。
document.body.onclick = function(event){ alert(event.currentTarget === document.body); //true alert(this === document.body); //true alert(event.target === document.getElementById("myBtn")); //true };
所有問(wèn)事件的target和currentTarget區(qū)別的問(wèn)題,都是在變相的問(wèn)事件委托。
因?yàn)樽釉貙⑹录械礁讣?jí)的時(shí)候,event的target指向的還是子元素,而currentTarget指的是父元素
事件模擬
事件創(chuàng)建
參數(shù)事件類型字符串UIEvents
document.createEvent(EventTypeString)
UIEvents:一般化的 UI 事件。 鼠標(biāo)事件和鍵盤事件都繼承自 UI 事件。 DOM3 級(jí)中是 UIEvent;
MouseEvents:一般化的鼠標(biāo)事件。 DOM3 級(jí)中是 MouseEvent;
MutationEvents:一般化的 DOM 變動(dòng)事件。 DOM3 級(jí)中是 MutationEvent;
HTMLEvents:一般化的 HTML 事件。沒有對(duì)應(yīng)的 DOM3 級(jí)事件(HTML 事件被分散到其他類 別中);
KeyboardEvents :DOM3級(jí)中添加
var btn = document.getElementById("myBtn"); //創(chuàng)建事件對(duì)象 var event = document.createEvent("MouseEvents"); //初始化事件對(duì)象 event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0,false, false, false, false, 0, null); //添加事件監(jiān)聽 btn.addEventListener("click",e => console.log(e)) //觸發(fā)事件dispatch中動(dòng)態(tài)將this綁定到event.target上,也就是btn btn.dispatchEvent(event); //執(zhí)行監(jiān)聽函數(shù) //e
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/101696.html
摘要:定義是一個(gè)由可以接收事件的對(duì)象實(shí)現(xiàn)的接口,并且可以為它們創(chuàng)建偵聽器。重點(diǎn)分割線只有通過(guò)上面的繼承關(guān)系,我們得到的元素才是一個(gè)完整的對(duì)象,我們才能為它設(shè)置獲取屬性綁定事件添加樣式類等操作。 寫在前面,本文將同步發(fā)布于Blog、掘金、segmentfault、知乎等處,如果本文對(duì)你有幫助,記得為我得到我的個(gè)人技術(shù)博客項(xiàng)目給個(gè)star哦。 為何寫這篇文章? 你可能做Web開發(fā)已經(jīng)有一段時(shí)間,...
摘要:介紹自定義事件之前,首先要介紹一種設(shè)計(jì)模式觀察者模式。自定義事件背后的概念是創(chuàng)建一個(gè)管理事件的對(duì)象,讓其他對(duì)象監(jiān)聽這些事件。問(wèn)自定義事件的認(rèn)知邏輯是什么答咳咳應(yīng)該是觀察者模式吧,能力有限,具體的描述以后補(bǔ)上。 介紹自定義事件之前,首先要介紹一種設(shè)計(jì)模式--觀察者模式。 事件是一種叫做觀察者的設(shè)計(jì)模式,是一種創(chuàng)建松散耦合代碼的技術(shù)。 觀察者模式有兩類對(duì)象組成:主體和觀察者。主體負(fù)責(zé)發(fā)布...
摘要:預(yù)解釋變量和函數(shù)的預(yù)解釋只發(fā)生在當(dāng)前的作用于中中內(nèi)存的分類棧內(nèi)存用來(lái)提供一個(gè)代碼指定的環(huán)境作用域全局作用域和局部作用域堆內(nèi)存用來(lái)存儲(chǔ)引用類型的值對(duì)象存儲(chǔ)的是鍵值對(duì),函數(shù)儲(chǔ)存的是字符串函數(shù)執(zhí)行的時(shí)候形成一個(gè)私有作用域有形參給形參賦值,形參也 預(yù)解釋 變量和函數(shù)的預(yù)解釋只發(fā)生在當(dāng)前的作用于中 js中內(nèi)存的分類 棧內(nèi)存:用來(lái)提供一個(gè)js代碼指定的環(huán)境 —>作用域(全局作用域和局部作用域...
摘要:搞清之間的關(guān)系指的事件綁定時(shí)的對(duì)象指的事件發(fā)生所在的對(duì)象,例如你的把事件可以綁在父元素上,點(diǎn)擊子元素,此時(shí)指的是父元素,指的是你點(diǎn)擊的子元素。是一個(gè)非標(biāo)準(zhǔn)屬性,是老對(duì)于的實(shí)現(xiàn),指的事件發(fā)生所在的對(duì)象。 搞清Event.currentTarget、Event.target、Event.srcElement之間的關(guān)系 Event.currentTarget: https://develo...
閱讀 3036·2021-11-24 10:21
閱讀 1604·2021-10-11 10:57
閱讀 2818·2021-09-22 15:24
閱讀 2685·2021-09-22 14:58
閱讀 2340·2019-08-30 13:16
閱讀 3493·2019-08-29 13:05
閱讀 3426·2019-08-29 12:14
閱讀 3465·2019-08-27 10:55