如何使用打字稿将参数传递给 addEventListener 侦听器函数?

Fra*_*rsi 0 javascript event-listener addeventlistener dom-events typescript

情况有点像:

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

错误

Sco*_*cus 5

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

document.addEventListener("keyup", function(event){ searchKeyPressHandler(event, x,y,z); });
Run Code Online (Sandbox Code Playgroud)

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

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

document.addEventListener("keyup", handler);

// And later...
document.removeEventListener("keyup", handler);
Run Code Online (Sandbox Code Playgroud)

  • @FrancescoOrsi在这种情况下,只需不要传递匿名函数,而是声明该函数,然后传递该名称。我将更新答案以展示这两种方法。 (2认同)