2014-03-26 44 views
0

呼叫事件我有以下代码重复一些时间,只有一些变化:与功能处理器+参数的jQuery

$('#mapContainer').on({ 
    mouseenter: function() { 
     Map.ApplyEvents.Country(this.id); 
    }, 
    click: function() { 
     Map.Zoom.State(this.id); 
    } 
}, 
'.mapaCountry path'); 

// this is in another function 
$('#mapContainer').on({ 
    mouseenter: function() { 
     Map.ApplyEvents.State(this.id); 
    }, 
    click: function() { 
     Map.Zoom.County(this.id); 
    } 
}, 
'.mapaState path'); 

在所有的事件,我得叫一个匿名函数只是调用1功能在里面。

有没有办法挤进这个代码所需功能分配处理程序,还通知参数与this.id

我要实现的是这样的:
(注:我知道这是错误的语法。)

$('#mapContainer').on({ 
    mouseenter: Map.ApplyEvents.Country(this.id), 
    click: Map.Zoom.State(this.id) 
}, 
'.mapaCountry path'); 

$('#mapContainer').on({ 
    mouseenter: Map.ApplyEvents.State(this.id); 
    click: Map.Zoom.County(this.id) 
}, 
'.mapaState path'); 

回答

0

我知道我以前一直懊恼与此有关。如果我没有记错,这是一个声明的问题。

我认为这是行不通的。

function myFunction(){} 

这是的。

var myFunction() = function(){} 

也许这并不能解决你确切的问题,因为我不知道你的函数是如何声明的。

2

恕我直言,你的第一个片段是为了实现你想要的最惯用的方式。


如果真有这样的绑定不计其数,而你的地图API由采取恰好一个唯一的字符串参数的功能完全,你能拿出一个定制粘合剂:

$.fn.bindIDlistener = function(handlers, sel) { 
    var wrapper = {}, evt; 
    for (evt in handlers) { 
     wrapper[evt] = function(){ handlers[evt](this.id); }; 
    } 
    this.on(wrapper, sel); 
} 

//usage : 
$('#mapContainer').bindIDlistener({ 
    mouseenter: Map.ApplyEvents.Country, 
    click: Map.Zoom.State 
}, 
'.mapaCountry path'); 

$('#mapContainer').bindIDlistener({ 
    mouseenter: Map.ApplyEvents.State, 
    click: Map.Zoom.County 
}, 
'.mapaState path'); 

但我仍然建议强烈思考此方法的小优点(每个事件处理程序20个字符),以应对可能遇到的快速限制(在链中添加另一个失败点,代码对外部方不太易读,难以通过处理程序的第二个参数,等等......)