2010-01-11 53 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