动态加载JQuery形成外部链接到JavaScript文件

时间:2012-01-18 11:35:24

标签: javascript jquery

  1. 我有一个简短的脚本,客户添加到他们的网站加载我们提供的应用程序
  2. 此代码将启动应用程序的JavaScript异步加载到客户端页面上(弹出窗口)
  3. 启动应用程序的代码(启动代码:-)需要jQuery
  4. 有些客户在他们的网站上使用jQuery都准备就绪......有些人不...
  5. 我真正想要实现的是,加载到页面上的代码检查文档是否存在JQuery,如果它不存在,则将其加载到页面上,因此启动代码可以使使用它
  6. 现在我花了一段时间将这个JavaScript放在一起,我已经到了jQuery在需要时添加到页面的阶段任何后续脚本似乎都无法使用它,除非我已添加警报!!喜欢警报('Hello World');

    我的想法是,警报功能设法让DOM以某种方式“重新加载”来更新DOM中的jQuery链接......我的理解肯定会落到这一点......

    任何帮助将非常感谢,提前感谢

    以下是我所拥有的内容,以下是将jQuery附加到客户端页面的“启动代码”部分,它通过第1点中提到的加载脚本进行外部链接。

    if (typeof jQuery == 'undefined') {
      //alert('No jQuery! Will attempt to load it now');
      var script = document.createElement('script');
      script.type = "text/javascript";
      script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js";
      document.getElementsByTagName('head')[0].appendChild(script);
      tryReady = function(time_elapsed) {
        if (typeof jQuery == "undefined") { // if jQuery isn't loaded yet...
          if (time_elapsed <= 100000) { // and we havn't given up trying...
            setTimeout("tryReady(" + (time_elapsed + 200) + ")", 200); // set a timer to check again in 200 ms.
          } else {
            alert('hello'); // If this isn't here, the subsequent scripts fail to access jQuery
          }
        } else {
          //alert ("jQuery wasn't but now is loaded")
        }
      }
      tryReady();
    }      
      // Functions making use of jQuery go here...
    

2 个答案:

答案 0 :(得分:1)

考虑使用onload标记的script属性。

if (typeof jQuery == 'undefined') {
  var script = document.createElement('script');
  script.type = "text/javascript";
  script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js";
  script.onload = function(){
    alert('voila');
  }
  document.getElementsByTagName('head')[0].appendChild(script);
}

答案 1 :(得分:0)

这确实看起来像Require.js的任务,而不是所有额外的复杂性......

它将抽象加载脚本的所有复杂性,并为您提供良好的依赖性解析方法。

修改:已更新以响应海报需求。

由于您确实在尝试使用上述方法,因此问题在于您正在使用异步编程构造(setTimeout)以便稍后执行某些代码,但期望获得同步结果。

你的tryReady()方法是在第一个if内调用的(没有参数?为什么?)并立即返回,因为jQuery还没有准备好(大概是这样,除非你的基础结构真的非常非常快)和 //使用jQuery的函数在这里行被击中。

与此同时,setTimeout将启动并尝试检查jQuery是否已加载。重复此过程,直到加载jQuery,这将触发您的alert("jQuery wasn't but now is loaded")行。只是在那一刻,你知道jQuery真的被加载了(在else语句中)。

如果您添加alert,它会起作用,因为警报窗口是同步的并保持脚本执行,直到按下确定按钮。你这样做的时间可能足以让jQuery加载,因此你可以引用它。

另外,我真的不知道你要用time_elapsed来实现什么,因为它从未用于任何有意义的事情......