我有一些示例代码绑定事件处理程序,如下所示:
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);
我得到1
,h1
之后的第一个参数。在所有情况下,this
的值已正确设置为h1
,但在最后一种情况下,传递的参数似乎替换预期的事件对象。
如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?
答案 0 :(得分:5)
但在最后一种情况下,传递的参数似乎替换了预期的事件对象。
使用bind
创建一个具有预先指定的初始参数的函数。
这些参数(如果有的话)遵循提供的
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();