从javascript包含javascript库的标准方法

时间:2009-10-28 23:11:23

标签: jquery ajax yui javascript

我想从我的javscript include中获取jquery库。

这是否100%有效?还有更好的方法吗?

(function() {

var loadJquery = function (cb) {
    var addLibs = function () {
        if (typeof(document.body) == "undefined" || document.body === null) {
            setTimeout(addLibs, 100);
            return;
        }

        var node = document.createElement("script");
        node.src = "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js";
        document.body.appendChild(node);
        checkLib();
    };

    var checkLib = function () {  
        if (typeof($) == "undefined" || $("*") === null) {
            setTimeout(checkLib, 100);
            return;
        }
        cb($.noConflict());
    }
    addLibs();
}

loadJquery(function($){
  // Do stuff with $
  $(document.body).css("background", "black");
});

})();

如果您想要YUI3,请将node.src$.noConflict更改为YUI;如果您是YUI2,则将YAHOO更改为

4 个答案:

答案 0 :(得分:4)

我只能用这种方法考虑一个问题(在上个月的问题上已经出现了两次)。

问题是1.3.2中的jQuery无法检测文档是否已加载(如果文档加载后它本身也包含在内)(即正在进行动态<script>包含,bookmarklet等) em>非 -IE浏览器。在这种情况下,传递给.ready()的函数将永远不会被调用。

以下是此问题的错误报告:http://dev.jquery.com/ticket/4196过去8个月内没有发生任何事情。

现在,我设计loadJquery的方式应该有效地取代$(document).ready(),因此您可能不必担心。但是以$(document).ready()函数传递样式编写的任何代码都不会执行。

答案 1 :(得分:2)

从工作中的内部邮件列表上发帖,我被指出:

动态涉及许多跨浏览器边缘情况 注入脚本。如果将YUI 3种子文件滚动到脚本中则不行 一个选项,如果你不能依赖房产已经拥有 YUI 3种子加载,我建议使用LazyLoad(无耻插件)来 引导您的脚本:http://github.com/rgrove/lazyload/

您可以将lazyload.js合并到您的脚本中,然后使用类似的东西 加载YUI 3种子,如果它还没有在页面上:

(function () {
   function init() {
     YUI().use('node', function (Y) {
       // ... do my stuff ...
     });
   }

   if (YUI) {
     init();
   } else {
     LazyLoad.js('http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js',
init);
   }
})();

答案 2 :(得分:0)

如果您正在寻找标准方式,而不是想出自己的实现,您可能会考虑:

  • Google google.load()用于加载热门图书馆
  • CommonJS SecurableModules - 有关浏览器实施的信息,请参阅Kris Kowal的Chiron

答案 3 :(得分:0)

请参阅我的答案,获取可靠的异步require()函数:How do I include a JavaScript file in another JavaScript file?