2010-01-11 64 views
3

我正在創建一個新的JavaScript項目,我想稍後發佈。除了其他功能外,該腳本還需要一點DOM操作。爲了製作這個XB(跨瀏覽器)並且不再發明輪子,我需要現有JavaScript庫的幫助。由於大量的優秀圖書館,我不想強​​迫這個項目的一個圖書館。這就是爲什麼我想要在一個腳本中支持多個庫。在一個腳本中支持多個JavaScript庫

瞭解我的jQuery,但其他庫我沒有足夠的經驗。 所以我想知道是否一個教程或文章,在腳本腳本支持多個JavaScript庫?

我讀過的地方,CSS選擇器引擎(Sizzle,Selector.js,Peppy,NWMatcher,cssQuery)也是如此,但我不知道JS。

+0

我很好奇人們對此有何評論。框架不可知的吧.. +1 – Perpetualcoder 2010-01-11 22:46:54

+3

你可以看看ExtJs是如何做到的。看看src \ adapter,他們對yui,prototype,jquery或其本地lib有一些基本dom的東西有自己的抽象。 – 2010-01-11 22:55:26

+0

謝謝羅蘭B.你的評論是最有用的。糟糕的是沒有關於它的文章,轉換本身也被用在圖書館中。 – jerone 2010-01-12 08:03:08

回答

0

this page第二點意見給出了一個有趣的答案:Swiss - JavaScript框架框架。

+0

剛剛發現了一個使用適配器來支持多個JavaScript庫的腳本:http://www.shadowbox-js.com/ – jerone 2010-02-08 10:54:44

3

那麼,使用jQuery,您可以使用$ .noConflict()函數從全局命名空間中刪除'$'和'jQuery'變量,以防止頁面的其他部分使用其他版本的jQuery或另一個聲明'$'變量的庫。

這裏有一個簡單的例子...

<script src="/path/to/jquery.min.js" type="text/javascript"></script> 
<!-- load plugins you require here --> 
<script type="text/javascript"> 

var myUniquelyNamedVar = {}; 
myUniquelyNamedVar.jQuery = $.noConflict(true); // de-aliases jQuery, but gives you a private reference (if you need it) 

(function($) { 
    // use an anonymous function and pass in your private jQuery instance; inside this function you can use $ like normal... 
})(myUniquelyNamedVar.jQuery); 
</script> 

我已經使用JSR-168 portlet的這一做法,並取得了巨大成功。它允許我在頁面上有幾個portlet,每個portlet可以使用不同版本的jQuery或不同的插件。

+0

'noConflict'與新腳本中的實現無關。 jQuery蟎甚至沒有被使用過。 – jerone 2010-01-12 07:57:48

1

我不認爲有很多關於通用框架足夠相似以至於有用地抽象它們。儘可能地堅持常規DOM。

關於唯一有用的,可重用的操作,我可以想到許多框架以類似的方式提供的將是選擇器引擎。因此,像:

function querySelectorAll(selector) { 
    if ('querySelectorAll' in document) 
     return document.querySelectorAll(selector); // native Selectors-API is best 
    if ('jQuery' in window) 
     return jQuery(selector); // returns a wrapper object, but it's enough like an array 
    if ('$$' in window) 
     return $$(selector); // prototype 
    if ('YAHOO' in window && 'util' in YAHOO && 'Selector' in YAHOO.util) 
     return YAHOO.util.Selector.query(selector); // yui 
    // others? 
    throw 'No selector engine found'; 
} 
+0

是的,這是CSS選擇器引擎。看起來像這種方法對圖書館本身是不可能的,因爲它們被放在一起的方式非常不同。 – jerone 2010-01-12 07:56:40