2014-03-27 23 views
0

我确信这是一个基本问题。我正在创建一个自定义的JavaScript类,并在顶部使用Jquery来做一些事情。在检查文档是否准备好之后,我调用init()并添加事件处理程序。然而,当我按一下按钮,我进去“turnLightOn”功能,但是当它试图调用另一个函数该类这个范围已更改为“按钮”,所以我得到按钮被按下时,Javascript简单的类范围发生变化

Object #<HTMLButtonElement> has no method 'getDataFromServer' 

我知道这是一个简单的问题,但任何人都可以指出正确的答案吗?

<div id="cp"> 
    <ul> 
<li><button id="light_switch">Light On</button></li> 

    </ul> 
</div>  

<div id="room"> 
</div> 
<script type="text/javascript"> 
var CP = function(widget, light_switch){ 
    this.widget_name = widget; 
    this.light_switch = light_switch; 
    var self = this; 
    console.log(this); 
}; 
CP.prototype.init = function(){ 
    $("#"+this.light_switch).on('click', this.turnlighton);  
}; 
CP.prototype.somecallback = function(){ 
    console.log(this); 
}; 
CP.prototype.turnlighton = function(){ 
    this.getDataFromServer(somecallback); 
}; 
CP.prototype.getDataFromServer = function(callback){ 
    $.ajax({url:"/"+fname, 
      success:function(result){ 
       callback(result); 
      } 
    }); 
};  

$(document).ready(function(){ 
     var c = new CP("control_panel", "light_switch"); 
     c.init(); 
    } 
); 
</script> 

回答

2
在默认情况下,将参照点击的元素的单击处理 this

,您可以通过使用Function.bind()$.proxy()通过自定义背景

$("#" + this.light_switch).on('click', $.proxy(this.turnlighton, this)); 

演示:Fiddle

+1

这个工作。所以,这是因为“this”关键字具有的特殊环境。有没有比使用代理或绑定更好的方法来处理这个问题?其实你可以举一个例子吗? – user1647708

+0

@ user1647708在给定的场景我没有看到另一种方式,但只是用另一种方式使用闭包变量 - http://jsfiddle.net/arunpjohny/8aD9U/4/ –

+0

感谢演示。你看到在这个范围内需要两个“var self”的必要性吗? – user1647708

0

我发现这个问题:

$("#"+this.light_switch).on('click', this.turnlighton); 

在这个上面的代码this.turnlighton将在jQuery中采取当前on()方法。你使用CP功能这个。

<script type="text/javascript"> 

var _this; 
var CP = function(widget, light_switch){ 
    this.widget_name = widget; 
    this.light_switch = light_switch; 
    _this = this; 
    console.log(this); 
}; 
CP.prototype.init = function(){ 
    $("#"+_this.light_switch).on('click', _this.turnlighton);  
}; 
CP.prototype.turnlighton = function(){ 
    console.log(this); 
    _this.getDataFromServer(); 
}; 
CP.prototype.getDataFromServer = function(){ 
    /*$.ajax({url:"/"+fname,success:function(result){ 
     console.log(result); 
    }});*/ 
};  

$(document).ready(function(){ 
     var c = new CP("control_panel", "light_switch"); 
     c.init(); 
    } 
); 
</script> 

Fiddle

+0

将不起作用,因为'self'没有被定义在'init'的范围内 –

+0

现在我编辑了这个场景,请替换代码 –

+0

中的init函数,它们也不起作用。 – user1647708