国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

實現一個EventTarget類

Pocher / 1846人閱讀

摘要:是一個由可以接收事件的對象實現的接口,并且可以為它們創建偵聽器。方法節在上注冊特定事件類型的事件處理程序。將事件分派到此。代碼的其他方法節擴展,供實現的事件目標使用以實現屬性。級中是一般化的變動事件。

EventTarget

EventTarget是一個由可以接收事件的對象實現的接口,并且可以為它們創建偵聽器。

Elementdocumentwindow 是最常見的事件目標,但是其他對象也可以是事件目標,比如XMLHttpRequestAudioNodeAudioContext 等等。

許多事件目標(包括元素,文檔和 window)還支持通過 on... 屬性和屬性設置事件處理程序。

構造函數節

EventTarget()

創建一個新的 EventTarget 對象實例。

方法節

EventTarget.addEventListener()

在EventTarget上注冊特定事件類型的事件處理程序。

EventTarget.removeEventListener()

EventTarget中刪除事件偵聽器。

EventTarget.dispatchEvent()

將事件分派到此EventTarget。

Mozilla chrome 代碼的其他方法節

Mozilla擴展,供JS實現的事件目標使用以 實現 on* 屬性。另見 WebIDL bindings 綁定。

void setEventHandler(DOMString type, EventHandler handler)

EventHandler getEventHandler(DOMString type)

示例節 EventTarget 的簡單實現節
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);
            //可能會添加多個
            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"});

當單擊這個例子中的按鈕時, this 和 currentTarget 都等于 document.body,因為事件處理程 序是注冊到這個元素上的。然而, target 元素卻等于按鈕元素,因為它是 click 事件真正的目標。由 于按鈕上并沒有注冊事件處理程序,結果 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
};

所有問事件的target和currentTarget區別的問題,都是在變相的問事件委托。

因為子元素將事件委托到父級的時候,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)

事件模擬

事件創建

參數事件類型字符串UIEvents

document.createEvent(EventTypeString)

UIEvents:一般化的 UI 事件。 鼠標事件和鍵盤事件都繼承自 UI 事件。 DOM3 級中是 UIEvent;

MouseEvents:一般化的鼠標事件。 DOM3 級中是 MouseEvent;

MutationEvents:一般化的 DOM 變動事件。 DOM3 級中是 MutationEvent;

HTMLEvents:一般化的 HTML 事件。沒有對應的 DOM3 級事件(HTML 事件被分散到其他類 別中);

KeyboardEvents :DOM3級中添加

var btn = document.getElementById("myBtn");
//創建事件對象
var event = document.createEvent("MouseEvents");
//初始化事件對象
event.initMouseEvent("click", true, true, document.defaultView, 0, 0, 0, 0, 0,false, false, false, false, 0, null);
//添加事件監聽
btn.addEventListener("click",e => console.log(e))
//觸發事件dispatch中動態將this綁定到event.target上,也就是btn
btn.dispatchEvent(event);
//執行監聽函數
//e

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101696.html

相關文章

  • 如何形成一個完整的HTML對象

    摘要:定義是一個由可以接收事件的對象實現的接口,并且可以為它們創建偵聽器。重點分割線只有通過上面的繼承關系,我們得到的元素才是一個完整的對象,我們才能為它設置獲取屬性綁定事件添加樣式類等操作。 寫在前面,本文將同步發布于Blog、掘金、segmentfault、知乎等處,如果本文對你有幫助,記得為我得到我的個人技術博客項目給個star哦。 為何寫這篇文章? 你可能做Web開發已經有一段時間,...

    freewolf 評論0 收藏0
  • 自定義事件

    摘要:介紹自定義事件之前,首先要介紹一種設計模式觀察者模式。自定義事件背后的概念是創建一個管理事件的對象,讓其他對象監聽這些事件。問自定義事件的認知邏輯是什么答咳咳應該是觀察者模式吧,能力有限,具體的描述以后補上。 介紹自定義事件之前,首先要介紹一種設計模式--觀察者模式。 事件是一種叫做觀察者的設計模式,是一種創建松散耦合代碼的技術。 觀察者模式有兩類對象組成:主體和觀察者。主體負責發布...

    陸斌 評論0 收藏0
  • javascript基礎學習

    摘要:預解釋變量和函數的預解釋只發生在當前的作用于中中內存的分類棧內存用來提供一個代碼指定的環境作用域全局作用域和局部作用域堆內存用來存儲引用類型的值對象存儲的是鍵值對,函數儲存的是字符串函數執行的時候形成一個私有作用域有形參給形參賦值,形參也 預解釋 變量和函數的預解釋只發生在當前的作用于中 js中內存的分類 棧內存:用來提供一個js代碼指定的環境 —>作用域(全局作用域和局部作用域...

    魏明 評論0 收藏0
  • 有關DOM Event事件和自定義Event相關文檔文章介紹速記

    摘要:搞清之間的關系指的事件綁定時的對象指的事件發生所在的對象,例如你的把事件可以綁在父元素上,點擊子元素,此時指的是父元素,指的是你點擊的子元素。是一個非標準屬性,是老對于的實現,指的事件發生所在的對象。 搞清Event.currentTarget、Event.target、Event.srcElement之間的關系 Event.currentTarget: https://develo...

    callmewhy 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<