Man*_*ngo 4 javascript events event-listener function-binding eventhandler
我有一些示例代码绑定事件处理程序,如下所示:
var h1=document.querySelector('h1');
h1.onclick=doit;
function doit(x) {
console.log(x);
}
Run Code Online (Sandbox Code Playgroud)
触发事件处理程序时(通过单击h1
元素),输出是一个event
对象,如预期的那样.
如果我绑定事件处理程序如下:
h1.onclick=doit.bind(h1);
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果.
但是,如果我按如下方式绑定它:
h1.onclick=doit.bind(h1,1);
Run Code Online (Sandbox Code Playgroud)
我得到了1
,之后的第一个参数h1
.在所有情况下,vallue都this
被正确设置为h1
,但在最后一种情况下,传递的参数似乎替换了预期的事件对象.
如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?
但在最后一种情况下,传递的参数似乎替换了预期的事件对象.
使用bind
创建具有预先指定的初始参数的函数.
这些参数(如果有的话)遵循提供的
this
值,然后在传递给目标函数的参数的开头插入,然后在调用绑定函数时传递给绑定函数的参数.
这意味着,如果你这样做:
h1.onclick=doit.bind(h1,1);
Run Code Online (Sandbox Code Playgroud)
正如您所提到的那样,值this
被绑定,h1
但是由于您绑定到第一个参数,因此将事件onclick
作为第二个参数传递给doit
而不是第1
一个参数.所以你仍然得到这个事件,它没有被替换,它只是在所有绑定的参数之后传递.
如何在不将事件处理程序重写为函数表达式的情况下保留事件对象?
你不能.事件将在您之前绑定到函数的所有参数之后传递,因此您必须考虑该事件.对于给定的情况,doit
看起来像:
function doit(one, e) {
console.log(this, one, e); // on click logs: h1 object, 1, event object
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2397 次 |
最近记录: |