我有一个使用这些方法的构造函数:
function getMouseXY(event){
var x = event.clientX - this.offsetLeft;
var y = event.clientY - this.offsetTop;
return [x,y];
}
function alertx(){
var c = this.getMouseXY(event);
alert(c[0]);
}
在HTML代码中,我将alertx函数分配给HTML5画布'事件鼠标:
document.getElementById('cbackground').addEventListener('mouseup', object.alertx, false);
预期的结果是什么?点击画布它显示鼠标的X位置,而不是什么都没有 . 使用Firebug进一步探索我的错误“事件未定义” . 我不知道如何避免这种情况!有小费吗?谢谢!
3 回答
在
var c = this.getMouseXY(event);
上,您将一个未分配的变量(事件)传递给该函数,这就是它爆炸的原因 . 也许你忘了在alertx()中添加参数?在函数alertx中,事件永远不会被初始化 .
如果你使用
function alertx(event)
它应该工作 .让我们看看几个问题:
alertx()
未收到event
参数 .在该函数中,您使用
this
调用getMouseXY
. 此时此关键字将引用触发事件的元素 .您正在将事件处理程序绑定到未知的
object
变量 .我想你想做这样的事情:
如果你有一个构造函数,并且上面的函数是实例方法,你可以这样做:
绑定事件时,可以添加匿名函数来强制执行上下文:
Edit: 在回复您的评论时,您只需要知道如何设置上下文(
this
关键字) implicitly :当您调用实例方法时:
method
中的this
关键字将引用obj
.调用全局变量时会发生同样的事情,因为它们是全局对象的成员(浏览器脚本中的
window
):相当于:
并且该函数内的上下文将是全局对象本身(
window
) .使用
new
运算符时会发生另一种情况:在这种情况下,
this
关键字将是一个新对象,通过使用new
运算符创建 .当您使用函数作为事件处理程序时,
this
关键字将引用触发事件的元素:在这种情况下,
myFunction
是obj
的实例方法,但this
关键字将引用已单击的DOM元素 .最后,正如您在我的代码中看到的那样,可以通过使用call或apply来设置上下文 explicitly .