2013-02-28 112 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(); }