使用 Javascript 加载 jQuery 并使用 jQuery

IT技术 javascript jquery
2021-02-08 12:12:42

我正在使用以下方法将 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 中使用它?

6个回答

这里有一个工作 JSFiddle 和一个小例子,它准确地展示了你正在寻找的东西(除非我误解了你的要求)http : //jsfiddle.net/9N7Z2/188/

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

您可以使用一些现有的 JavaScript 加载器,或者通过 watch forwindow.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.jQuery使用重复的存在window.setTimeout这里有一个使用该方法的有效 JSFiddle:http : //jsfiddle.net/9N7Z2/3/

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

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

还有另一种动态加载 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,但为了完成起见,最好提及它。

请参阅为什么 document.write 被认为是“不好的做法”?原因。document.write不加载其他资产产生阻止你的页面,所以没有必要创建一个回调函数。

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

Encosia 的网站推荐:

<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>
这就是 jQuery 加载器所做的。您引用加载器,加载器会为您将 jQuery 注入到文档中。
2021-03-30 12:12:42
我只能加载一个 javascript。这意味着我必须动态加载 google jsapi 然后从加载 jquery?对于我的用例来说似乎是多余的。
2021-04-11 12:12:42

您需要在 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,试试这个

您收到此错误的原因是 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);