使用bind将参数传递到事件侦听器中的命名函数



早些时候在listener中发布了命名函数,但随着我的理解越来越多,它很快就改变了焦点,所以我想我现在应该发布一些更好地反映这个问题的内容。

我要做的事情:

  • 将侦听器添加到元素列表中(已完成(
  • 将参数传递给侦听器中的回调(不起作用(
  • 删除那些侦听器(已完成(

因此点1&3需要我在事件侦听器中使用一个命名函数,这样我就可以在删除侦听器时引用同一个对象。

对于第2点,为了传递额外的参数,我使用bind。因为它更改了回调的方法签名(?(,所以我将其存储在一个单独的变量focusInHandler中。这是有效的,并且在调用时会删除侦听器。

然而,我的主要问题是:传递额外的参数目前不起作用。我知道clearText的第一个自变量是event对象,(afaik(e.currentTarget等效于thise.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) => { ... } )

最新更新