2012-03-27 234 views
0

我試圖讓我的代碼清潔器不是依賴一個小部件,而對於這一點,我真的很喜歡JQuery widgets.創建DOM元素

今天,我想創建不相關的DOM元素的部件:

$.widget('ui.resaWidget', { 
    options : { 
     viewer : null 
    }... 
}); 

我發現叫這個小部件的唯一方法是:

$(aDomElement).resaWidget(); 

有沒有辦法叫我小部件在這樣一個辦法:

$.resaWidget() ? 

因爲事實上,我的小部件是用於整個頁面的生成,而不僅僅是一個DOM元素。

順便說一下,$('body').resaWidget()似乎不起作用。

感謝您的幫助。

回答

0

有幾種創建jQuery插件的方法。

最常見的一種是將一個功能件加到jQuery.fn(實際上是相同jQuery.prototype):

(function ($) { 
    "use strict"; 
    $.fn.foo = function (/* function parameters */) { 
     this.each(doStuff); 
     return this; //makes the function chainable 
    }; 
}(jQuery)); 

該方法用於增加上jQuery實例可調用的函數。 I.E .:

$(selector).foo(); 

jQuery UI的widget工廠是擴展jQuery.fn的簡寫方法。


延伸的jQuery的另一個常見的手段是將函數添加到jQuery本身:

(function ($) { 
    "use strict"; 
    $.foo = function (/* function parameters */) { 
     doStuff(); 
    }; 
}(jQuery)); 

這種方法被用來從jQuery添加靜態可調用的函數。 I.E .:

$.foo(); 

jQuery UI的widget工廠不能(目前爲1.8)創建這些靜態函數。使用Widget工廠的主要原因是爲了保存上下文。如果你有一個沒有上下文的靜態函數(不需要$()),那麼你只需要在函數中編寫你自己的功能。

+0

謝謝你的回答。 有了這個解決方案,我失去了小工廠的所有結構,我不能使用「_」作爲私人成員,也不能使用公共成員。 有沒有辦法使用這兩個優點,或者我需要編碼我自己的工廠? – Vico 2012-03-27 14:20:02

+0

每個函數只能在其關閉範圍內訪問。標準的JavaScript實踐不會因爲使用jQuery而消失。我個人沒有看到工廠需要靜態可訪問的功能。 – zzzzBov 2012-03-27 14:49:36

0

我知道這是一個老問題,但從jQuery UI 1.9開始,您現在可以通過將小部件原型上的defaultElement屬性設置爲null來創建基於非DOM的小部件。