2012-04-15 76 views
-1

内我有这样的代码:无法访问对象的属性,事件

var Obj = { 
    el : document.getElementById("elementId"), 

    doSomething : function(){ this.el.property = "value" } 
}; 

Obj.el.addEventListener('click', Obj.doSomething); 

但是当点击事件被触发元素this.el是不确定的? 是什么导致了这种情况发生?

注意:我不知道如何在此编辑器中破坏代码中的行,这就是为什么它在一行中。

+1

很难详细说明它为什么不起作用,因为有很多不同的东西是完全错误的。是什么让你认为这样的事情会起作用? – Pointy 2012-04-15 22:08:08

+1

*“我不知道如何在这个编辑器中破坏代码中的行”*在编写问题时,右侧有一个标题为“如何格式化”的框。值得一读,就像问题文本区域上方的** [?] **链接中提供的各种信息一样。 – 2012-04-15 22:17:26

回答

5

在JavaScript(不像类似的语法大多数其他语言),this完全由定义的函数是如何调用,而不是在那里的定义。调用事件处理程序的方式,this在您的函数中不会引用您的对象。

你可以纠正它在三个方面:

  1. 如果你的目标ES5使能的浏览器或包括ES5 “垫片”,使用Function#bind

    var Obj = { 
        el : document.getElementById, 
    
        doSomething : function(){ this.el.property = "value" } 
    }; 
    
    Obj.el.addEventListener('click', Obj.doSomething.bind(Obj)); 
    
  2. 否则,使用一个closure

    var Obj = { 
        el : document.getElementById, 
    
        doSomething : function(){ this.el.property = "value" } 
    }; 
    
    Obj.el.addEventListener('click', function(event) { 
        return Obj.doSomething(event); 
    }); 
    
  3. 正如RobG在评论中指出的,因为你只有一个Obj对象(而不是有一个构造函数,或者根据需要创建多个对象),你可以使用它的变量(Obj)引用该对象,而不是this

    var Obj = { 
      el : document.getElementById, 
    
        // Obj instead of this ---v 
      doSomething : function(){ Obj.el.property = "value" } 
    }; 
    
    Obj.el.addEventListener('click', Obj.doSomething); 
    

    ,只有当对象是在它的定义(这对于你的Obj例如为true)范围内的一次性工作。如果唯一需要的参考是this(例如,您没有Obj),则无法执行此操作,并且需要先前两个选项之一。

更多:


请注意,您el财产的嫌疑,但。你已经将它定义为

el : document.getElementById, 

...这意味着el现在指向功能getElementById。这可能不是你想要做的。想必你的意思el指你通过getElementById检索DOM元素,例如:

el : document.getElementById("someIdValue"), 

更多here

+0

谢谢你明确的答案和有用的参考链接,现在一切正常:) – fenerlitk 2012-04-15 22:18:48

+0

在我的代码中,它完全和你所提到的一样,我不想复制这里的所有代码,它在第一个看起来很杂乱去吧,然后我想我会写一些类似的东西,只用那些不起作用的代码,我错过了你提到的那个错误 – fenerlitk 2012-04-15 22:27:38

+0

OP也可以使用'Obj.el.property = value;'。 – RobG 2012-04-15 22:46:06