[英]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.