2012-01-10 32 views
1

我在jQuery中使用.delegate()處理回調函數時遇到了一些問題。此設置使用2個文件 - 其中$ B是創建的,另一個是簡單的$(doc).ready文件。jQuery代表回調

我有一個SVG文件與<g>標籤一堆(50+)我需要跟蹤,當我點擊,側翻,部署等而不是附加的功能到<g>節點,代表看起來像一個更清潔的選擇。

但是,我遇到了一個問題,我認爲這是我在JavaScript方面相對缺乏的知識。

下面是我的主要就緒()文件中的設置:

$C.Events.onStation({ 
    click : function(e){ 
     console.log(e) 
      return false; 
    }, 
    mouseenter : function(e){ 
     return false; 
    }, 
    mouseleave : function(e){ 
     return false; 
    } 
}) 

這工作正常。一切都穿過,裏面等我的$ B.Events對象:

Events : new function(){ 
    var _station = function(obj){ 
     // delegate the events to the primary SVG node 
     for(var type in obj){ 
      $(City.Map.node).delegate('g', type, function(){ 
      obj[type]() 
     }) 
    } 
    return { 
     onStation : _station 
    } 
    // others taken out for relevance 
}() 

現在,有了這個,如果我只是在obj[type]傳入另一個函數進行包裝,而不是,它工作正常。唯一的問題是我需要做一些事前處理(即與事件數據對象混淆)以及將所有return false的代碼移動到代理代碼中,而不是把我的其他文件弄糟。

那麼如何從jQuery的.delegate()函數中的回調處理函數中執行的第一個代碼塊獲取函數?

編輯迴應

我認爲這是朝着正確方向邁出的一步。我有一種感覺,它有JS的本質,但不一定是邏輯。這就是爲什麼我有時候討厭Javascript。

該解決方案的問題在於它將基元傳遞給通用構建器函數。我需要存儲並返回一個可執行的函數。我試過的幾件事情都沒有成功。這裏有許多事情我試過一個例子:

var _station = function(events){ 
    var _funcs = {} 
    var _selection = null; 

    var create = function(f){ 
     return function(){ return f() } 
    } 
    for(var t in events){ 
     _funcs[t] = create(t, events[t]) 
    } 
    console.log(_funcs) 

    // delegate the events to the primary SVG node 
    for(var type in events){ 
     $('#stations', Bart.Map.node).delegate('g', type, function(e){     
      _funcs[type](e) 
      e.stopPropagation() 
     }) 
    } 
} 

當我log(_funcs[type])它回來的功能,但我不能執行它爲我的生活。

這封閉的東西殺了我。

+1

我不太清楚,但我認爲你的問題是你正在循環中創建一個閉包。請看看[這個問題](http:// stackoverflow。com/questions/750486/javascript-closure-inside-loops-simple-practical-example),讓我們知道這是否解決了這個問題。 – 2012-01-10 10:10:11

+0

是的,我認爲這與此有關,但我無法獲得適合我使用的代碼。我更新了原文,以反映。謝謝菲利克斯,我們將其添加爲書籤以供將來使用。 – Phix 2012-01-10 19:40:41

回答

2

你仍然有生成一個循環閉包的問題。您可以通過type作爲事件數據:

var $target = $('#stations', Bart.Map.node); // capturing is a good idea 

for(var type in events){ 
    $target.on(type, 'g', {type: type}, function(e){     
     _funcs[e.data.type](e); 
     e.stopPropagation(); 
    }) 
} 

或者你可以用jQuery.each遍歷events

​​

重要的一點是,每封(事件處理程序)有它自己的type變量訪問。

請注意,我使用.on()而不是.delegate()作爲自jQuery 1.7以來的首選。

+0

你打敗了我!我重新討論了'on()'方法,它似乎很好。非常感謝您投入時間。乾杯! – Phix 2012-01-10 20:18:51

+0

不客氣:) – 2012-01-10 20:20:43

+0

@FelixKling,你知道一種將事件委託給SVG元素的方法嗎? – Starx 2013-01-21 04:01:11