2013-07-16 48 views
0

可以通過刪除匿名函數來簡化圖1中的事件處理程序嗎?我找不到用$.proxy解決這個問題的方法,但也許我錯過了一些東西。自定義事件的觸發器在圖2該事件處理程序是否可以簡化並刪除匿名函數?

需要使用.bind,因爲正在使用較舊的jQuery版本,並且此時無法更新。

doSomething的簽名需要兩個參數,都是字符串。

圖1:事件處理程序

$(mySelector).bind('EVT_MY_CUSTOM', function (e, foo, bar) { 
    doSomething(foo, bar); 
}); 

圖2:觸發

$(mySelector).trigger('EVT_MY_CUSTOM', ['apple', 'banana']); 
+2

在哪裏你看到這些代碼片段的複雜性? –

+1

爲什麼不修改'doSomething',所以它需要第一個參數來忽略它呢?然後你可以直接將事件綁定到它。 – Barmar

+0

代碼是否正常工作?除非您明確描述問題,否則匿名或非匿名函數並不重要? –

回答

0

如何:

$('div').bind('EVT_MY_CUSTOM', doSomething) 

然後在doSomething

var fruit = Array.prototype.slice.call(arguments, 1); // ['apple', 'banana'] 

演示:http://jsfiddle.net/PKwcC/

如果您已經定義doSomething其他地方,創建從參數列表中去掉該事件對象的代理:

var proxy = function() { 
    doSomething.apply(this, Array.prototype.slice.call(arguments, 1)); 
} 

$('div').bind('EVT_MY_CUSTOM', proxy) 

演示:http://jsfiddle.net/PKwcC/1/

+0

如果doSomething在其他地方使用,只傳遞兩個參數會怎麼樣? –

+0

如果......如果這是一項要求,您應該在問題中發佈'doSomething'代碼。 – David

+0

我使用代理解決方案編輯了答案。但不清楚這是否是你要求的:] – David

相關問題