【问题标题】:Binding and event handler — passing the event object绑定和事件处理程序——传递事件对象
【发布时间】:2016-09-23 19:55:35
【问题描述】:

我有一些示例代码绑定了一个事件处理程序,如下所示:

var h1=document.querySelector('h1');
h1.onclick=doit;

function doit(x) {
        console.log(x);
}

当事件处理程序被触发时(通过点击h1 元素),输出是一个event 对象,正如预期的那样。

如果我按如下方式绑定事件处理程序:

h1.onclick=doit.bind(h1);

我得到了同样的结果。

但是,如果我按如下方式绑定它:

h1.onclick=doit.bind(h1,1);

我得到1h1 之后的第一个参数。在所有情况下,this 的值都正确设置为h1,但在最后一种情况下,传递的参数似乎替换预期的事件对象。

如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?

【问题讨论】:

  • 它不会替换它,它会 precede 它(事件将作为第二个参数传递)。但是,如果您希望在第一个参数中包含事件,请不要部分应用该函数(不要给它bind 参数)。

标签: javascript events eventhandler event-listener function-binding


【解决方案1】:

但在最后一种情况下,传递的参数似乎替换了预期的事件对象。

使用bind 创建一个带有预先指定初始参数的函数。

MDN Docs:

这些参数(如果有)遵循提供的 this 值,然后插入到传递给目标函数的参数的开头,然后是传递给绑定函数的参数,只要调用绑定函数。

这意味着,如果你这样做:

h1.onclick=doit.bind(h1,1);

this 的值绑定到h1,正如您所提到的,但来自onclick 的事件作为第二个参数 传递给doit,而不是第一个,因为您将1 绑定到第一个参数。所以你仍然得到事件,它没有被替换,它只是在所有绑定参数之后传递。

如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?

你不能。该事件将在您之前绑定到函数的所有参数之后传递,因此您必须考虑到这一点。对于给定的情况,doit 看起来像:

function doit(one, e) {
  console.log(this, one, e); // on click logs: h1 object, 1, event object
}

【讨论】:

  • 所以doit 函数应该类似于doit(x,e)。好的,这行得通,只要我不允许可选参数会使整个事情变得一团糟。谢谢。
  • 没问题,很高兴为您提供帮助:)
【解决方案2】:

如果您查看this link,它会说第一个参数之后的参数成为传递给函数的第一个参数。

如果您只使用 h1 元素调用它,那么您所做的就是将函数绑定到该 h1 元素。如果您在第二个参数中传递任何其他内容,它将成为传递给函数的第一个参数。

示例

function testing(a, b, c) {
  console.log(this.property, a, b, c);
}

var obj = {
  property: 'value!'
};

var bound_test = testing.bind(obj, 'Bound Test A');
bound_test('test 1', 'checking console output');
bound_test() // should give two undefined in console since we are only giving the first object.

var bound2_test = testing.bind(obj, 'Bound test B', 'something ');
bound2_test('this will be the "c" argument');

var bound3_test = testing.bind(obj, 'Bound test C', 'Test', ' another, yet different test.');
bound3_test();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2021-01-01
    • 2019-09-13
    • 2019-08-04
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多