javascript - 使用绑定将参数传递给事件监听器中的命名函数
问题描述
之前在侦听器中的命名函数上发布过,但随着我理解的更多,它很快改变了焦点,所以我想我会发布一些现在更好地反映这个问题的东西。
我正在尝试做的事情:
- 将侦听器添加到元素列表(完成)
- 将参数传递给侦听器中的回调(不起作用)
- 移除那些监听器(完成)
所以第 1 点和第 3 点需要我在事件侦听器中使用命名函数,这样我可以在移除侦听器时引用同一个对象。
对于第 2 点,为了传递额外的参数,我正在使用bind
. 因为它改变了回调的方法签名(?),所以我将它存储在一个单独的变量focusInHandler
中。这有效,并且在调用时删除了侦听器。
但是要解决我的主要问题:当前传递额外的参数不起作用。我知道 to 的第一个参数clearText
是event
对象,并且 (afaik)e.currentTarget
等价于this
,并且e.target
是事件起源的元素,
但我怎样才能访问其他参数?
// index.js
adminView.addFocusInListeners(arrayOfElements, adminView.clearText);
// adminView.js
let focusInHandler;
export const addFocusInListeners = (items, cb) => {
items.forEach(item => {
focusInHandler = cb.bind(item, 'extra argument');
item.addEventListener('focusin', cb);
});
};
export const removeFocusInListeners = (items, cb) => {
items.forEach(item => {
focusInHandler = cb;
item.removeEventListener('focusin', cb);
});
}
export const clearText = (e, text) => {
// e.currentTarget === this
console.log(e.currentTarget);
// e.target === the element clicked
console.log(e.target);
// undefined?
console.log(text);
console.log(this);
};
我可能遗漏了一些非常简单的东西,但这与我所能得到的一样接近:(
谢谢!
解决方案
.bind() 返回一个新函数,其中this
是您的第一个参数。所以你必须添加focusInHandler
为你的事件监听器。
关于删除和添加,您可以继续将事件处理程序推送到数组并使用 forEach 和正确的索引来删除:
forEach((element, index) => { ... } )
推荐阅读
- python - 为什么我不能在 for 循环中将两个列表解压缩为格式字符串?
- intellij-idea - 我无法让 Intellij 上的 Glassfish 服务器运行
- c++ - 传递给 std::function 模板的模板参数究竟代表什么?
- javascript - 使用 CSS 或 JavaScript 的 Chrome 样式拼写检查错误
- python - 如何为以下结果编写 Sparql 查询?
- python - 为什么 TypedDict 与匹配 Mapping 不兼容?
- ionic-framework - Ionic 4 弹出窗口显示在屏幕末尾
- r - 为什么 Dplyr group_by 不尊重 .drop=FALSE
- c# - ASP.MVC 模型到 JS 对象并返回到 C#
- authentication - 如何获取我自己的用户帐户详细信息?