javascript对象文本中定义的事件处理程序可以访问自身吗?
我知道如果对象是一个函数,我可以用闭包(var self=this)实现这一点javascript对象文本中定义的事件处理程序可以访问自身吗?,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,我知道如果对象是一个函数,我可以用闭包(var self=this)实现这一点 <a href="#" id="x">click here</a> <script type="text/javascript"> var object = { y : 1, handle_click : function (e) { alert('handling click'); //
<a href="#" id="x">click here</a>
<script type="text/javascript">
var object = {
y : 1,
handle_click : function (e) {
alert('handling click');
//want to access y here
return false;
},
load : function () {
document.getElementById('x').onclick = this.handle_click;
}
};
object.load();
</script>
变量对象={
y:1,,
手柄点击:功能(e){
警报(“处理点击”);
//想在这里访问y吗
返回false;
},
加载:函数(){
document.getElementById('x').onclick=this.handle\u click;
}
};
load();
因此,事件处理程序部分连接得很好(我自己测试过),但正如您的注释所示,您无法访问刚刚定义的对象的“y”属性
这项工作:
var object = {
y : 1,
handle_click : function (e) {
alert('handling click');
//want to access y here
alert(this.y);
return false;
},
load : function () {
var that = this;
document.getElementById('x').onclick = function(e) {
that.handle_click(e); // pass-through the event object
};
}
};
object.load();
还有其他方法可以做到这一点,但这是可行的。将对
句柄的调用绑定到它所定义的对象的最简单方法如下:
var self=this;
document.getElementById('x').onclick =
function(e) { return self.handle_click(e) };
如果您需要传入参数或希望使代码看起来更干净(例如,如果您正在设置许多类似的事件处理程序),则可以使用currying技术来实现相同的目的:
bind : function(fn)
{
var self = this;
// copy arguments into local array
var args = Array.prototype.slice.call(arguments, 0);
// returned function replaces first argument with event arg,
// calls fn with composite arguments
return function(e) { args[0] = e; return fn.apply(self, args); };
},
我知道怎么用杰森的最新一个。如果没有匿名函数,有什么方法可以这样做吗?多亏了AddEventListener,我们可以使用处理程序方法直接传递对象,并且您可以访问其属性:
希望这将有助于那些像我一样,在几年后寻找这个话题的人 问题不在于onclick处理程序的设置,这很好。问题是当handle\u click执行时,无法访问“y”变量的值。它不起作用-我测试了它,但由于事件处理程序的工作方式,它返回时未定义,“this”成为触发click事件的元素(至少在FF3中是这样)。好吧,也许我误解了这个问题?发布的代码sw234工作正常-但正如您所指出的,在“handle\u click”中无法访问“y”。我以为他是在问如何绑定处理程序,以便它可以通过这个提供对“y”的访问…好吧,也许我也误解了这个问题-有多种方法可以处理这个问题,你的方法也可以。我知道比需要的更复杂。Jason,你可以更改警报(y);提醒(这件事);,结果是一样的-你已经在对象的上下文中调用了处理程序,不需要把y作为参数传入。是的,我明白了。当我受到止痛药的影响时,我需要避免发帖p你要么被闭包约束,要么被全局变量约束。你为什么要在关门时翘鼻子?它们是JavaScript最好的特性之一。。。
document.getElementById('x').onclick = this.bind(this.handle_click,
"this parameter is passed to handle_click()",
"as is this one");