2012-12-14 52 views
3

我的問題是,我需要處理矩形的多個事件。這聽起來很簡單, 例如這工作Raphael.js - 註冊多個事件到元素

node.click(function(e){ 
    click(); // this is function defined in same scope, it works ok 
    }); 

    node.mouseout(function(e){ 
    mouseout(); 
    }); 

但是,我想你完成這項,所以它應該是這樣的:

var events = new Array("click", "mouseout"); 
for(var i in events){ 
    node[events[i]](function(e){ 
     events[i](); /*THIS is problem, no matter if it is click or mouseout 
         this always fires function with same name as last item 
         in events array (in this case mouseout) 
         */ 
    } 
} 

你有什麼想法,爲什麼我應該如何解決呢?

回答

1

您在循環中創建的處理程序正在共享一個變量。當它們被調用時,變量是循環中的最後一個值。

你必須使用我稱之爲「凍結你的閉包」的技術,以便每個處理程序獲得一個單獨的共享變量副本。在你的情況下,改變的共享變量是i

你的其他問題是你想從一個字符串調用你的函數「click/mouseout」,所以你必須得到一個函數的句柄,現在你的代碼正試圖呼叫"hello"()這是行不通的

你最後的問題(但不是一個錯誤)是你不應該使用數組構造函數,你不應該使用for in循環迭代數組。

function createHandler(eventName) { 
    return function(e) { 
     window[eventName](); 
    } 
} 

var events = ["click", "mouseout"]; 
for(var i=0; i < events.length; i++){ 
    node[events[i]](createHandler(events[i])); 
} 

上面的例子更容易理解,但你可以使用自調用匿名函數做同樣的事情

var events = ["click", "mouseout"]; 
for(var i=0; i < events.length; i++){ 
    node[events[i]]((function(eventName){ 
     return function(e) { 
      window[eventName](); 
     }; 
    })(events[i])); 
} 
+0

謝謝,現在我明白了..但我怎麼能輕易解決這個問題,普萊舍? – Jadro007

+0

@ user1905088我正在處理它,只想獲得解釋 –

+0

尼斯,我更喜歡第二種解決方案..但是現在我有 節點[events [i]] = function(e){ alert( 「好」); (e); }(events [i]); 當它被盯住時,它會點亮,點擊,確定,鼠標移出,但當點擊或移出矩形時,它不會觸發。任何想法? – Jadro007