2012-01-10 287 views
3

我正在制作一对小部件,这些小部件可以单独包含或作为一对包含在内,并且没有特别的顺序。我确保jQuery是加载通过使用这个脚本:检查是否包含jQuery

if (typeof jQuery == 'undefined') { 
    //alert("about to load jquery"); 

    var esm_script_tag = document.createElement('script'); 
    esm_script_tag.setAttribute("type","text/javascript"); 
    esm_script_tag.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js") 
    esm_script_tag.onload = main; // Run main() once jQuery has loaded 

    esm_script_tag.onreadystatechange = function() { // Same thing but for IE 
     if (this.readyState == 'complete' || this.readyState == 'loaded') main(); 
    } 

    document.getElementsByTagName("head")[0].appendChild(es_script_tag); 

} 
else{ 

    main(); 
} 

在一个脚本,它触发功能main()和其他main2()。问题是,一旦第一个脚本运行,它开始包括jQuery。当第二个运行时,jQuery尚未加载,但不会再加载它以启动功能main2()

有没有更好的方法来包含jQuery?有没有办法让我的小部件检查jQuery是否处于被加载的状态并保持到它准备好?

感谢您的回复。

+0

如果你在文档准备好了这个测试呢? – DOK 2012-01-10 21:11:11

+0

@DOK这不是多余的吗? – Blazemonger 2012-01-10 21:14:25

+0

但是$(document).ready在jQuery加载之前不可用。 – emachine 2012-01-10 21:14:29

回答

1

当然,首先您应该考虑使用第三方库进行依赖关系管理。然而,当你想将原始代码包含到每个小部件时,可能会出现这种情况,因此它可以在没有任何其他预先请求的引用的情况下生存。

上的jsfiddle我创造了什么你试图去抚仿真:http://jsfiddle.net/ayezutov/dvvKE/16/

下面的代码使用超时效仿脚本加载延迟:

setTimeout(function() { 
     document.getElementsByTagName("head")[0].appendChild(esm_script_tag); 
    }, Math.floor(Math.random(500))); 

在量产版,这应该是肯定的写在你的代码中。

因此,经过一些重构,加载代码被移动到一个函数:http://jsfiddle.net/ayezutov/dvvKE/20/。这个问题仍然存在,你可以注意到:

加载的jQuery从脚本1:从脚本2
加载的jQuery:
执行主脚本1:1.5.1
执行主脚本2:1.5.2

下一步是创建一个自定义队列,这会排队的所有加载请求,里面传来了jQuery加载开始后:

if (!window.__jQueryLoadedQueue) 
     window.__jQueryLoadedQueue = [loadCompleted]; 
    else 
    { 
     window.__jQueryLoadedQueue.push(loadCompleted); 
    } 

    var completeFunction = function(){ 
     for(var i = 0; i < window.__jQueryLoadedQueue.length; i++){ 
      window.__jQueryLoadedQueue[i](); 
     } 
     delete window.__jQueryLoadedQueue; 
    } 

正如你所看到的(http://jsfiddle.net/ayezutov/dvvKE/23/)现在脚本开始只加载一次,而complete函数被调用。

+0

一个更文明的年龄的优雅的答案。 - 感谢您花时间做到这一点。 – emachine 2012-01-11 16:07:00