【问题标题】:Load jQuery with Javascript and use jQuery用 Javascript 加载 jQuery 并使用 jQuery
【发布时间】:2012-04-24 04:42:54
【问题描述】:

我将 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 中使用它?

【问题讨论】:

  • 与更优化的方式相比,您是否有理由想要这样做?
  • 这个问题的一些答案可能会对你有所帮助 - stackoverflow.com/questions/7474354/…
  • @Scott 是的。我有一个应用程序,在安装时它会同时加载 jquery 和脚本。我需要在脚本中加载 jquery,以便 jquery 不会破坏用户主题。我需要有条件地将javascript加载到他们主题中的某个网页上。请相信我。
  • 为什么 jQuery 会破坏用户的主题?如果加载 jQuery(对 css 没有影响)会破坏主题,那么你做错了。
  • 好点,但是,如果他们使用的是旧版本的 jQuery 或其他库怎么办?

标签: javascript jquery


【解决方案1】:

这里有一个可用的 JSFiddle 和一个小例子,它准确地展示了你在寻找什么(除非我误解了你的请求)http://jsfiddle.net/9N7Z2/188/

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

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

// Immediately-invoked function expression
(function() {
  // Load the script
  const script = document.createElement("script");
  script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js';
  script.type = 'text/javascript';
  script.addEventListener('load', () => {
    console.log(`jQuery ${$.fn.jquery} has been loaded successfully!`);
    // use jQuery below
  });
  document.head.appendChild(script);
})();

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

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

  • https://developers.google.com/loader/(不再记录)
  • http://yepnopejs.com/(已弃用)
  • http://requirejs.org/

【讨论】:

  • 此解决方案有效,但在 WordPress 中除外。任何方式都可以修改它以将 jQuery 加载到不同的对象中?
  • @SanuelJackson 对于 Wordpress,您应该使用 wp_enqueue_script() 函数来正确包含 jQuery。文档:codex.wordpress.org/Function_Reference/wp_enqueue_script 更多信息:digwp.com/2009/06/including-jquery-in-wordpress-the-right-way 或此处:digwp.com/2011/09/using-instead-of-jquery-in-wordpress
  • 是的,我的意思是上面的代码在 Wordpress 上不起作用,因为它也异步加载 jQuery。即使这个脚本被加载在页面的最底部(就在关闭 html 之前),jQuery 也没有完全“初始化”,因此它没有看到 jQuery 加载,并继续加载并执行回调。加载后,它会干扰其他异步加载的内容,这些内容依赖于以不同方式加载的 jQuery(例如 $、jQuery 等),或依赖于不同版本的 jQuery。
  • 在我尝试过的其他情况下很棒。只是记下了唯一明显的问题。如果可以以某种方式对其进行调整,但我认为这是不可能的,因为它取决于检测 jQuery,当然没有加载,因此只能继续执行 - 如果没有 jquery ... then ..
  • 你不需要做轮询,你可以只用一行来等待 jquery 使用 .onload 事件加载,比如stackoverflow.com/a/42013269/3577695
【解决方案2】:

还有另一种动态加载 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确实会阻止您的页面加载其他资产,因此无需创建回调函数。

【讨论】:

  • 我阅读了您链接到的文档,对于我为 IE8 加载较旧的 jQuery 库的用例,使用 document.write 似乎没问题。到目前为止,它对我来说效果很好。
  • 这是最简单最直接的方法。在一个相当大的脚本(它是一个单独的 JS 文件)的开头这样做会不会有问题?太好了,不能放弃。
【解决方案3】:

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>

【讨论】:

  • 我只能加载一个 javascript。这意味着我必须从该加载 jquery 动态加载 google jsapi?对于我的用例来说似乎是多余的。
  • 这是 jQuery 加载器所做的。你引用加载器,加载器为你将 jQuery 注入到文档中。
【解决方案4】:

您需要在 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

【讨论】:

    【解决方案5】:

    你得到这个错误的原因是 JavaScript 没有等待脚本被加载,所以当你运行时

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

    不能保证脚本已经准备好(永远不会)。

    这不是最优雅的解决方案,但它是可行的。本质上,您可以每 1 秒检查一次 jQuery 对象广告在加载您的代码时运行一个函数。我还会添加一个超时(比如运行 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】:

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

      我通常推荐这个库来管理对 Javascript 的所有依赖项。它很简单,可以有效优化资源加载。但是,在将它与 JQuery 一起使用时,您可能需要使用一些 precautionsgithub 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>
      

      【讨论】:

        【解决方案7】:

        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>
        

        【讨论】:

        • 困难的部分是在加载脚本之后运行脚本......为什么脚本会未定义!??
        【解决方案8】:

        DevTools 控制台,您可以运行:

        document.getElementsByTagName("head")[0].innerHTML += '<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"><\/script>';
        

        https://code.jquery.com/jquery/查看可用的jQuery版本。

        要检查它是否已加载,请参阅:Checking if jquery is loaded using Javascript

        【讨论】:

          猜你喜欢
          • 2016-04-10
          • 2011-07-21
          • 2013-11-12
          • 2014-12-30
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          • 1970-01-01
          • 2011-11-12
          相关资源
          最近更新 更多