使用Javascript加载jQuery并使用jQuery

时间:2012-04-11 20:22:49

标签: javascript jquery

我使用以下命令将jQuery库附加到dom:

 var script = document.createElement('script');
 script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
 script.type = 'text/javascript';
 document.getElementsByTagName('head')[0].appendChild(script);

但是当我跑步时:

jQuery(document).ready(function(){...

控制台报告错误:

Uncaught ReferenceError: jQuery is not defined

如何动态加载jQuery以及在dom中使用它?

7 个答案:

答案 0 :(得分:111)

这里有一个有效的JSFiddle,其中有一个小例子,它可以准确显示您正在寻找的内容(除非我误解了您的请求)http://jsfiddle.net/9N7Z2/188/

这种动态加载JavaScript的方法存在一些问题。当谈到非常基础的框架,比如jQuery,你实际上可能想要静态加载它们,否则,你将不得不编写一个完整的JavaScript加载框架...

您可以使用一些现有的JavaScript加载器,或者通过观察window.jQuery来定义自己编写。

// Immediately-invoked function expression
(function() {
    // Load the script
    var script = document.createElement("SCRIPT");
    script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    script.type = 'text/javascript';
    script.onload = function() {
        var $ = window.jQuery;
        // Use $ here...
    };
    document.getElementsByTagName("head")[0].appendChild(script);
})();

请记住,如果您需要支持 真正的 旧浏览器(如IE8),load事件处理程序不会执行。在这种情况下,您需要使用重复的window.jQuery轮询window.setTimeout的存在。这里有一个有效的JSFiddle:http://jsfiddle.net/9N7Z2/3/

有很多人已经完成了你需要做的事情。查看一些现有的JavaScript Loader框架,例如:

答案 1 :(得分:7)

还有另一种动态加载jQuery的方法(source)。你也可以使用

document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');

使用document.write被认为是不好的做法,但为了完成,最好提及它。

请参阅Why is document.write considered a "bad practice"?了解原因。 专家document.write阻止您的网页加载其他资源,因此无需创建回调函数。

答案 2 :(得分:6)

<强> Encosia's website recommends:

<script type="text/javascript" 
        src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
  // You may specify partial version numbers, such as "1" or "1.3",
  //  with the same result. Doing so will automatically load the 
  //  latest version matching that partial revision pattern 
  //  (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
  google.load("jquery", "1.7.2");

  google.setOnLoadCallback(function() {
    // Place init code here instead of $(document).ready()
  });
</script>

但即使他承认,只有在达到最佳性能时才做以下比较:

    <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript"> window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js">\x3C/script>')</script>
    <script type="text/javascript" src="scripts.js"></scripts>
</body>
</html>

答案 3 :(得分:2)

你需要在jQuery完成加载后运行你的代码

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
script.onload = function(){
    // your jQuery code here
} 

或者如果您在异步功能中运行它,可以在上面的代码中使用await

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
await script.onload
// your jQuery code here

如果您想首先检查页面中是否已存在jQuery,请尝试this

答案 4 :(得分:0)

HTML:

<html>
  <head>

  </head>
  <body>

    <div id='status'>jQuery is not loaded yet.</div>
    <input type='button' value='Click here to load it.' onclick='load()' />

  </body>
</html>   

脚本:

   <script>

        load = function() {
          load.getScript("jquery-1.7.2.js");
          load.tryReady(0); // We will write this function later. It's responsible for waiting until jQuery loads before using it.
        }

        // dynamically load any javascript file.
        load.getScript = function(filename) {
          var script = document.createElement('script')
          script.setAttribute("type","text/javascript")
          script.setAttribute("src", filename)
          if (typeof script!="undefined")
          document.getElementsByTagName("head")[0].appendChild(script)
        }

        </script>

答案 5 :(得分:0)

您收到此错误的原因是JavaScript不等待加载脚本,因此当您运行时

jQuery(document).ready(function(){...

无法保证脚本已准备好(永远不会)。

这不是最优雅的解决方案,但可行。基本上,你可以检查jQuery对象广告每1秒运行一个函数,当它加载你的代码时。我会添加一个超时(比如运行20次后的clearTimeout)以阻止检查无限期地发生。

var jQueryIsReady = function(){
    //Your JQuery code here
}

var checkJquery = function(){
    if(typeof jQuery === "undefined"){
        return false;
    }else{
        clearTimeout(interval);
        jQueryIsReady();
    }
}
var interval = setInterval(checkJquery,1000);

答案 6 :(得分:0)

使用require.js,您可以以更安全的方式执行相同的操作。您可以只定义对jquery的依赖关系,然后在加载时使用依赖项执行所需的代码,而不会污染命名空间:

我通常建议使用此库来管理Javascript的所有依赖项。它很简单,可以有效地优化资源加载。但是,在使用JQuery时可能需要考虑一些precautions。我最喜欢的处理它们的方法在github repo中进行了解释,并通过以下代码示例反映出来:

<title>jQuery+RequireJS Sample Page</title>
   <script src="scripts/require.js"></script>
   <script>
   require({
       baseUrl: 'scripts',
       paths: {
           jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min'
       },
       priority: ['jquery']
    }, ['main']);
    </script>