2012-08-27 69 views
0

我有一個JavaScript對象,它是與此類似:如何訪問事件對象?

var MyClass; 
MyClass = (function() { 

    // private 
    var $elems; 

    // constructor 
    function MyClass(selector) { 
     $elems = $(selector); 
     $elems.change(myEventHandler(e)); 
    } 

    // event handler 
    function myEventHandler(e) { 
     var isSelected = ($(e.target).attr('checked') == 'checked'); 
     if (isSelected) { 
      alert('You selected me'); 
     } 
    } 

    return MyClass; 

})(); 

我調用這個類在我的HTML文檔這樣的:

$(function(){ 

    var myClass; 
    myClass = new MyClass(".MySelector"); 

}); 

這給我的錯誤:

Uncaught ReferenceError: e is not defined MyClassJsFile.js:17 
    MyClass MyClassJsFile.js:17 
    (anonymous function) Step3:36 
    f.extend._Deferred.e.resolveWith jquery.min.js:16 
    e.extend.ready jquery.min.js:16 
    c.addEventListener.B 

我以爲我正在將事件對象傳遞給構造函數的這一行中的事件處理函數:

$elems.change(myEventHandler(e)); 

在這種情況下,我如何正確傳遞事件?

+0

你在使用什麼庫?爲什麼你在變量'$ elems'的名字中有'$'? – some

+1

@some他正在使用jQuery,並且領先的'$'是jQuery開發人員的一個常見提示,即所討論的變量包含jQuery對象而不是DOM元素。 – Alnitak

+0

是的,我正在使用jQuery。我喜歡命名約定,其中持有jQuery對象的變量的名稱以'$'開頭。 – quakkels

回答

2

您可以使用:

$elems.change(myEventHandler); // or $elems.on('change', myEventHandler) in 1.7+ 

只是通過參考權處理。因爲它是立即調用處理程序,然後嘗試將(不存在的)返回值綁定到change處理程序。

您對所選框的檢查過於複雜,順便說一句。你應該能夠這樣寫:

var isSelected = this.checked; 

是jQuery將設置this是改變了實際的DOM元素的基礎上,並可以立即檢查其布爾checked財產。

+0

$ .proxy()做什麼? – quakkels

+0

@quakkels從頭開始,我忘記了在jQuery處理程序中'this'應該指向單擊元素,而不是當前對象。 – Alnitak

4

您正在調用具有未定義變量的事件處理程序。事件處理程序的功能,所以只是通過函數的引用,而不調用它:

$elems.change(myEventHandler);