让我们看看几个问题:
- 的
alertx()
没有收到event
说法。
- 在该功能中,您使用
this
致电getMouseXY
。此时的关键字将引用触发事件的元素。
- 您正在将事件处理程序绑定到未知的
object
变量。
我想你想要做这样的事情:
function getMouseXY(event){
var x = event.clientX - this.offsetLeft, // notice, 'this' is used
y = event.clientY - this.offsetTop;
return [x,y];
}
function alertx(event){
var c = getMouseXY.call(this, event); // set the element as 'this'
alert(c[0]);
}
如果你有一个构造函数,和上面的功能是实例方法,你可以这样做:
function MyObject() { // constructor
}
MyObject.prototype.getMouseXY = function (event) {
var x = event.clientX - this.offsetLeft,
y = event.clientY - this.offsetTop;
return [x,y];
};
MyObject.prototype.alertx = function (event, element) {
var c = this.getMouseXY.call(element, event);
alert(c[0]);
}
当绑定的情况下,你可以添加一个匿名函数,执行上下文:
var object = new MyObject();
document.getElementById('cbackground').addEventListener('mouseup', function (e) {
object.alertx(e, this); // alertx will be called with the correct 'this'
}, false);
编辑:在回答您的意见,你只需要知道如何在上下文(this
关键字)设置隐含:
当你调用像一个实例方法:
obj.method();
的method
内的this
关键字,将参考到obj
。
同样的事情发生,当你调用全局变量,因为它们(在浏览器脚本window
)全局对象的成员:
globalFunction();
等同于:
window.globalFunction();
和上下文该函数内部将是全局对象本身(window
)。
var instance = new MyConstructor();
在这种情况下的this
关键字将是一个新对象,通过使用new
运营商的创建:
另一种情况,当你使用new
操作发生。
当你使用一个函数作为事件处理程序,该this
关键字将参考元素塔触发事件:
document.getElementById('myId').onclick = obj.myFunction;
在这种情况下myFunction
是obj
一个实例方法,但this
关键字将请参阅已被点击的DOM元素。
最后,因为你在我的代码所看到的,上下文可以通过使用call
或apply
设置明确。
惊人的人,谢谢!.call解决了这个问题,我会更多地了解它,我有一个构造函数,这些函数是它的方法,这种情况下原型的优点是什么? – 2009-12-08 19:50:27
Humm。我修改了代码以使其符合原型模型(构造函数,通过原型添加方法,您的第二种情况),并且我得到了“this.getmouseXY is undefined”。 – 2009-12-17 01:01:53
@Gabriel:您可以发布代码,在你的问题或http://jsbin.com? – CMS 2009-12-17 01:38:10