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

資訊專欄INFORMATION COLUMN

實(shí)現(xiàn)一個(gè)EventTarget類

Pocher / 1861人閱讀

摘要:是一個(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,documentwindow 是最常見的事件目標(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指的是父元素

  • w
  • m
  • x
//子元素將事件委托給了父元素 document.querySelector("ul").addEventListener("click",(e) => { let text = e.target.innerText || e.target.textContent; swicth(text){ case "w":{ console.info("this first li"); break; } case "m":{ console.info("this second li"); break; } case "x":{ console.info("this third li"); break; } default:{ new Error("No such Element") } } },false)

事件模擬

事件創(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

相關(guān)文章

  • 如何形成一個(gè)完整的HTML對(duì)象

    摘要:定義是一個(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í)間,...

    freewolf 評(píng)論0 收藏0
  • 自定義事件

    摘要:介紹自定義事件之前,首先要介紹一種設(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ā)布...

    陸斌 評(píng)論0 收藏0
  • javascript基礎(chǔ)學(xué)習(xí)

    摘要:預(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)境 —>作用域(全局作用域和局部作用域...

    魏明 評(píng)論0 收藏0
  • 有關(guān)DOM Event事件和自定義Event相關(guā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...

    callmewhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<