我寫了一個插件,構建了一個豐富的用戶界面控制。我希望有一種方法可以讓我以某種方式改變jQuery在查詢此元素時的操作方式。的jQuery插件創作和/或構造注入
我想jQuery的是無視這種控制的內部結構,但它不是一個真正的硬性要求。我今天準備這樣做,是的$('#RichUIControlID').val()
含義改變爲其他一些功能,因爲#RichUIControlID
是此控件的包裝元素(也許我使用一個CSS類識別元素)。
目前我有調用插件功能$('#RichUIControlID').richUIControlID().val()
將返回一個jQuery對象,具有必要的修改。 val()
確實在這種情況下我想要它做什麼。
但是,如果我能保持jQuery的界面,而無需額外的函數調用它會讓我繼續使用它在我的情況下,巨大的再利用價值熟悉的模式。
// I want to change val() depending on some property of the selector #RichUIControlID
$('#RichUIControlID').val()
可以這樣做嗎?
編輯1:
的一種方式做到這一點要歸功於mamoo提供的鏈接,會做這樣便:
(function() {
var val = jQuery.fn.val;
jQuery.fn.val = function() {
if (this.is('#RichUIControlID'))
return this.richUIControlID().val()
else
return val.apply(this, arguments);
}
})();
但是,感覺有點太冒昧。每撥號val()
都不必檢查它是否是#RichUIControlID元素,如果可能的話,我寧願在施工過程中將其掛鉤。
編輯2:
這是東西,瀏覽源代碼,它實際上是有可能採取同樣的方式jQuery的構造控制。這裏需要注意的是,如果你所做的第一件事就是不將該調用轉發給默認構造函數,那麼最終會產生一個麻煩的調用堆棧。
(function() {
var init = jQuery.fn.init;
jQuery.fn.init = function() {
var q = init.apply(this, arguments); // call this first
if (q.data('RichUIControlID'))
return q.richUIControlID();
else
return q;
}
})();
不錯!我的插件的公共接口非常小,但如果我沿着這條路走下去,我會將該API作爲附加插件提供。我有像get_selectedItem和get_selectedItems的東西。現在考慮可能會有幾個插件需要更改val方法的情況,我擔心它會導致一個大混亂,而不是在將jQuery對象構造爲包裝元素時添加/覆蓋該方法。對此有何想法? – 2010-11-09 11:34:37
你好約翰,這裏是我想出了最初的想法:您可以創建類似「extVal()」,它實現自定義的邏輯,並在overrided VAL()檢查是否extVal()的定義。如果真的應用擴展的方法,否則應用標準的val(),這是一個更優雅的解決方案... – mamoo 2010-11-09 13:06:38
整個觀點是使實現不透明。檢查我的編輯2,你會看到我如何以類似的方式更改init函數(構造函數)。 – 2010-11-09 20:42:39