javascript - 使用 bind() 将多个参数和事件传递给事件处理程序
问题描述
我想根据这个线程中的一些最新解决方案在这里.bind
使用该解决方案来实现事件处理程序。
但是,假设我的原始处理程序如下:
const clickHandler = (arg1, arg2) => {
...do stuff...
}
let var1 = "text1"
let var2 = "text2"
myButton.addEventListener("click", clickHandler.bind(null, var1, var2))
如果我需要向处理程序添加这样的需要event
参数的行:
const clickHandler = (arg1, arg2) => {
event.stopPropagation()
...do stuff...
}
如果我不使用 using .bind
,这将起作用:
const clickHandler = (arg1, arg2) => {
...do stuff...
}
let var1 = "text1"
let var2 = "text2"
myButton.addEventListener("click", (event) => {
event.stopPropagation()
clickHandler(var1, var2)
})
但是如果我想让它简洁使用.bind
,我应该如何传递event
给处理程序?谢谢。
解决方案
bind()
在第一个参数之后传递给的任何参数都会添加到在创建函数时提供给函数的参数,在这种情况下是event
. 这意味着在生成的绑定回调中,event
将是回调接收的最后一个参数,而不是第一个参数,如果不使用绑定则正常。this
保持不变,因为它是一个箭头函数。
如果您在每个参数中传递一致的已知数量的参数,bind()
则可以直接访问它们。
const clickHandler = (arg1, arg2, event) => {
...
}
否则,如果绑定参数的数量不同,您可以通过从迭代器中event
检索最后一个元素来访问 。arguments
const clickHandler = (...args) => {
const event = args.pop();
...
}
const myButton = document.getElementById('button');
const clickHandler = (...args) => {
const event = args.pop();
console.log(event.target);
console.log('args: ', args);
}
let var1 = "text1"
let var2 = "text2"
myButton.addEventListener("click", clickHandler.bind(null, var1, var2));
<button type='button' id='button'>Button</button>
推荐阅读
- java - Android Studio:SecondActivity 关闭
- visual-studio - 如何在 Visual Studio Professional 16.8.5 中为 C# 交互窗口启用智能感知?
- jsonschema - Fastify 和 json 模式验证
- python - 无法将“生成器”对象隐式转换为 str
- javascript - 如何将数据保留在页面上而不在 reactjs 中重新呈现?
- leaflet - 如何在 Leaflet 中对多边形进行子类化?
- redirect - 如何在 Fluent-hc 中关闭重定向
- java - 如何在句子中搜索特定单词
- angular - 如果我直接键入组件 url,如何在其他组件中获取 BehaviourSubject 值?
- sql - 根据插入表中的数据创建表