2013-01-04 178 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