2013-01-04 116 views
0

中指定的事件首先:對不起我的英語不好。Javascript函數綁定對象

我創建,在輸入得到一個JavaScript對象與此格式的功能:

var input = { 
    'selector1' : { 
     'event1' : function(element,value){ 
      // ... 
     }, 
     'event2' : function(element,value){ 
      // ... 
     }, 
     ... 
     'eventN' : function(element,value){ 
      // ... 
     } 
    }, 
    'selector2' : { 
     'event1' : function(element,value){ 
      // ... 
     }, 
     'event2' : function(element,value){ 
      // ... 
     }, 
     ... 
     'eventN' : function(element,value){ 
      // ... 
     } 
    } 
} 

我的功能綁定的事件是這樣的:

function event_binder(events_fns){ 
    for(sel in events_fns){ 
     for(ev in events_fns[sel]){ 
      $(sel).on(ev,function(){ 
       console.log(sel+'+'+ev); 
       var th = $(this); 
       var func_to_call = events_fns[sel][ev]; 
       func_to_call(th,th.html()); 
      }); 
     } 
    } 
} 

但是當我運行它,它顯示每個事件都被綁定到最後的事件。

我創建了一個對的jsfiddle更好地解釋我的問題: http://jsfiddle.net/Polmonite/6rRgr/

由於執行console.log建議,似乎總是事件結合使用最後 功能的對象。 如果我解釋正確,似乎'.on' 函數的評估只發生在最後,所以它使用'sel'和'ev'變量的最後一個值(一個範圍問題),但我不太瞭解如何解決它。

謝謝。

編輯:我需要指定一件事:我想創建一個'event_binder'函數的工作版本,而不是jsfiddle的工作版本,這只是一個例子。

+0

@Anton:我的目標是創建問題中指定的函數'event_binder'的工作版本。也許它不清楚,對此感到遺憾。我將編輯該問題。 – Polmonite

回答

2

問題是範圍 - 整個函數中只有一個selev變量,每次都會覆蓋它。要創建一個新的作用域(使用自己的變量),必須將它們包裝在自己的函數中。幸運的是,jQuery提供了一個可以傳遞函數的迭代函數,所以你沒有這個問題:$.each。參見:http://jsfiddle.net/6rRgr/3/

$.each(events_fns, function(sel, funcs) { 
    $.each(funcs, function(ev, func) { 
     $(sel).on(ev,function(){ 
      console.log(sel+'+'+ev); 
      var th = $(this); 
      func(th,th.html()); 
     }); 
    }); 
}); 
+0

我明白了。非常感謝您的解釋和代碼示例! ;) – Polmonite