2013-02-28 97 views
0

我有喜欢调用JavaScript类功能从jQuery的

MyClass = function() { } 
MyClass.prototype.init = function(param){ } 
MyClass.prototype.reset = function() { } 

一个JavaScript类,如果我用onClick="reset()"它的工作原理很好的调用这些函数从HTML页面。但如果我从jQuery调用这些函数,它不起作用。请给我建议。 从jQuery的示例调用:

$(document).ready(
    function() 
    { 
     app = new MyClass(); 
     app.init(someid, url, 
      "event_handling": { 
       "event1":app.reset 
      }); 
    }) 

与上面一起,是有可能添加CSS规则,如:

"css_class_names": { 
         style-1: "firstStyle", 
         style-2: "secondStyle" 
        } 

如果可能的话,那我怎么才能应用样式到具有特定元素ID 提前致谢!

+0

你只decla重新发挥功能。你永远不会说它。 – nhahtdh 2013-02-28 09:18:51

+0

究竟是“不工作”? – Jon 2013-02-28 09:19:53

+0

尝试“app.reset()”而不是“app.reset”,它的功能不是属性 – Merec 2013-02-28 09:20:49

回答

1

你的问题是,当应用程序调用event1时,它将从不同于你预期的上下文中调用app.reset。换句话说,在你的app.reset中,“this”变量不会成为你想要的。原因是当你声明event1: app.reset时,它将event1设置为函数app.reset。

解决方法:

"event1": function() { app.reset(); } 
+0

+1直接和重点。 :-) – 2013-02-28 09:24:42

+0

It works.Thank非常感谢您的迅速帮助。 – user2118784 2013-02-28 09:47:58

+0

@ user2118784我将不胜感激:) – yourdeveloperfriend 2013-02-28 09:52:21

0

你还没有真正显示从jQuery的你的电话,但我会猜是这样的:其实,你有,但问题是不与jQuery的呼叫。请参阅下面的细节。

假设:

$("some selector").click(app.reset); 

...这里要传递的app的方法为事件处理一个。

它不工作的原因是在调用方法中,this不会引用app实例,它会引用DOM元素。在JavaScript(现在)中,this完全由函数的调用方式定义,而不是定义的位置。

您可以通过给函数在通话过程中正确this值jQuery的$.proxy function

$("some selector").click($.proxy(app.reset, app)); 

或者,ECMAScript5定义Function#bind此:

$("some selector").click(app.reset.bind(app)); 

...但是,这要求你正在使用一个实现它的引擎运行,或者你有一个ES5垫片。

OR,如果你碰巧有一个方便的,你可以使用闭包:

$("some selector").click(function() { 
    app.reset(); 
}); 

在那里,我们正在使用,你有app变量躺在身边,通过在其上创建一个封闭(事实我们作为事件处理函数传递的函数)。

更多(在我的博客):


在您的代码:

$(document).ready(
    function() 
    { 
     app = new MyClass(); 
     app.init(someid, url, 
      "event_handling": { 
       "event1":app.reset 
      }); 
    }) 

上述讨论适用于

"event1":app.reset 

如果在某一点后,你叫event1()this不会app

您可以将修复上面,像这样:

jQuery.proxy

"event1":$.proxy(app.reset, app) 

Function#bind

"event1":app.reset.bind(app) 

关闭:

"event1":function() { app.reset(); }