2011-10-11 74 views
4

今天我有一點點沉悶,我無法想象這個問題的優雅解決方案。有沒有一種優雅的方式來重載插件內的jQuery方法?

我繼承了一個插件,我需要對其進行修改,以允許傳遞啓用禁用狀態到它,把它拆下所有的事件,顯示禁用狀態等

就像一個jQuery UI的插件,我只是要使用......

$('div').myPlugin('disabled'); 

這我有沒有問題。

但是,該插件附加了很多不是namespaced的事件。我希望事件是命名空間,所以我可以輕鬆地刪除事件。

有很多事件被綁定,所以我認爲嘿,爲什麼我不會重載bind()自動附加名稱空間?

我想出了這個...

(function(oldBind) { 
    $.fn.bind = function() { 
     if (arguments.length >= 2) { 
      arguments[0] += '.my-plugin'; 
     } 
     return oldBind.apply(this, arguments); 
    } 
})($.fn.bind); 

我把這個在插件的頂部,return this.each(fn)代碼之前。

它似乎很好地工作。

但是,我拋出console.log(arguments[1].toString()),並注意到(如我所料),這覆蓋了插件外部的主要jQuery bind()

什麼是這個超載bind()只適用於這個插件的最佳方式是什麼?

我應該簡單地放在插件末端$.fn.bind = oldBind還是有一個更簡單的方法?

回答

2

只需保存之前的功能,然後將其替換。

var oldBind = $.fn.bind; 
$.fn.bind = ...what ever you wanted... 
$.fn.bind = oldBind; 

這應該做的伎倆,它沒有經過測試,所以讓我知道如果它不起作用。

+1

因此,請保存對常規綁定的引用,使用已更改的綁定運行插件代碼,然後將其設置回來,對吧?我認爲這是@alex在問題最後提出的建議。 –

+0

是的,沒有簡單的方法。我唯一能想到的其他事情是用名稱空間綁定調用來替換舊插件中的代碼。 –

相關問題