绑定和事件处理程序 - 传递事件对象

时间:2016-05-26 01:40:46

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

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

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,但在最后一种情况下,传递的参数似乎替换预期的事件对象。

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

2 个答案:

答案 0 :(得分:5)

  

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

使用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
}

答案 1 :(得分:0)

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

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

实施例



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();