2010-11-09 16 views
1

我寫了一個插件,構建了一個豐富的用戶界面控制。我希望有一種方法可以讓我以某種方式改變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; 
    } 
})(); 

回答

2

您可以覆蓋一個jQuery的VAL()方法(參見http://www.bennadel.com/blog/1624-Ask-Ben-Overriding-Core-jQuery-Methods.htm)來實現自己的邏輯,並留下退回到原來的方法如果目標對象是一個標準。

+0

不錯!我的插件的公共接口非常小,但如果我沿着這條路走下去,我會將該API作爲附加插件提供。我有像get_selectedItem和get_selectedItems的東西。現在考慮可能會有幾個插件需要更改val方法的情況,我擔心它會導致一個大混亂,而不是在將jQuery對象構造爲包裝元素時添加/覆蓋該方法。對此有何想法? – 2010-11-09 11:34:37

+0

你好約翰,這裏是我想出了最初的想法:您可以創建類似「extVal()」,它實現自定義的邏輯,並在overrided VAL()檢查是否extVal()的定義。如果真的應用擴展的方法,否則應用標準的val(),這是一個更優雅的解決方案... – mamoo 2010-11-09 13:06:38

+0

整個觀點是使實現不透明。檢查我的編輯2,你會看到我如何以類似的方式更改init函數(構造函數)。 – 2010-11-09 20:42:39