简体   繁体   English

如何使用带有事件参数和参数的函数添加和删除事件侦听器?

[英]How do I add and remove an event listener using a function with event argument and parameters?

For example, I have below function to execute when mouseup event occurs.例如,当mouseup事件发生时,我有以下函数要执行。

const listener = (element: HTMLElement, e: MouseEvent): void => {
    if (e.target instanceof Element && element && !element.contains(e.target)) {
        element.style.backgroundColor = 'red';
    }
}

Then I am trying to figure out how to add extra paramter element to listener and remove it when it is not required anymore.然后我试图弄清楚如何向listener添加额外的参数element并在不再需要时将其删除。

function addEventListener (element: HTMLElement) => {
    window.document.addEventListener('mouseup', (e) => listener(element, e));
}

function removeEventListener (element: HTMLElement) => {
    window.document.removeEventListener('mouseup', ?? );
}

How can I solve this problem?我怎么解决这个问题?

I tried using bind like below, but MouseEvent cannot bind before addEventListener .我尝试使用如下绑定,但MouseEvent无法在addEventListener之前绑定。

let callback;

function addEventListener (element: HTMLElement) => {
    // how can I bind `MouseEvent`?
    callback = listener.bind(this, element, ??);
    window.document.addEventListener('mouseup', callback);
}

function removeEventListener (element: HTMLElement) => {
    window.document.removeEventListener('mouseup', callback);
}

Should I use closure here like below?我应该像下面这样使用闭包吗?

function createListener(element: HTMLElement) {
    return (e: MouseEvent) => {
        listener(element, e);
    }
}

let callback;

function addEventListener (element: HTMLElement) {
    callback = createListener(account);
    window.document.addEventListener('mouseup', callback);
}

function removeEventListener (element: HTMLElement) => {
    window.document.removeEventListener('mouseup', callback);
}

The same way you remove an event listener normally, but store an object (dictionary) that maps an HTMLElement to a function:与通常删除事件侦听器的方式相同,但存储将 HTMLElement 映射到函数的对象(字典):

interface Callbacks {
    [key: HTMLElement]: (e: MouseEvent) => void
}

let callbacks: Callbacks = {};

function addEventListener (element: HTMLElement) => {
    callbacks[element] = (e) => listener(element, e);
    window.document.addEventListener('mouseup', callback);
}

function removeEventListener (element: HTMLElement) => {
    window.document.removeEventListener('mouseup', callbacks[element]);
    delete callbacks[element];
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM