【问题标题】:How to pass arguments to addEventListener listener function with typescript?如何使用打字稿将参数传递给 addEventListener 侦听器函数?
【发布时间】:2020-08-17 16:50:01
【问题描述】:

情况有点像:

const searchKeyPressHandler = (appDispatch: any, e: any) => {
    if (e.keyCode === 27) {
        appDispatch({ type: "closeSearch" })
    }
}

document.addEventListener("keyup", searchKeyPressHandler); // <-- error on searchKeyPressHandler
return () => document.removeEventListener("keyup", searchKeyPressHandler); // <-- error on searchKeyPressHandler

searchKeyPressHandler 使用打字稿返回错误,我不知道如何避免它。

document.addEventListener("keyup", function (e) { searchKeyPressHandler(appDispatch, e) }); 可能是addEventListener的解决方案

但它对removeEventListener 没有用,因为该事件永远不会被删除 return () =&gt; document.removeEventListener("keyup", function (e) { searchKeyPressHandler(appDispatch, e) });.

【问题讨论】:

  • 别忘了传递参数
  • 报错信息怎么样?

标签: javascript typescript dom-events addeventlistener event-listener


【解决方案1】:

只需将实际的事件处理程序包装在一个匿名函数中,然后该函数就可以使用其参数调用您的函数。但是不要忘记事件处理程序会自动传递对触发它们的事件的引用,因此请在外部处理程序中捕获它并将其与其他参数一起传递:

document.addEventListener("keyup", function(event){ searchKeyPressHandler(event, x,y,z); });

或者,如果您需要多次使用您设置为“包装器”的函数(在以后必须删除侦听器的情况下),您只需使用名称声明该函数并传递将该名称转换为.addEventListner(),如下所示:

function handler(event){ 
  searchKeyPressHandler(event, x,y,z); 
}

document.addEventListener("keyup", handler);

// And later...
document.removeEventListener("keyup", handler);

【讨论】:

  • 使用箭头函数也更短document.addEventListener("keyup", (event) =&gt; searchKeyPressHandler(event, x,y,z));
  • @johannchopin 是的,但更短!==更好。而且由于您没有将 this 绑定到使用箭头函数触发函数的元素,因此我不希望将它们用于事件绑定。
  • 此解决方案适用于addEventListener,但不适用于removeEventListener(否则该事件将永远不会被删除)
  • @FrancescoOrsi 在这种情况下,不要传递匿名函数,而是声明函数,然后传递该名称。我将更新答案以显示这两种方法。
  • @ScottMarcus 你是最棒的!!!那是我正在寻找的解决方案!谢谢你!!!!超级谢谢你:)
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2022-01-21
  • 2019-03-29
  • 2014-05-25
  • 2021-11-27
  • 2020-06-12
  • 2017-10-05
相关资源
最近更新 更多