【问题标题】:How do I run a jQuery function after jQuery is loaded?加载 jQuery 后如何运行 jQuery 函数?
【发布时间】:2017-08-01 19:49:27
【问题描述】:

在我的网站上,我正在异步加载 jQuery。

为此,我必须在 jQuery 函数真正加载后才运行它。

我尝试了两种纯JS方式:

<script src="js/jquery-2.2.2.min.js" async></script>
<script>
    window.addEventListener('load', function() {
        //stuff
    }, true);
</script>

window.onload = function() {
    //stuff
}

但即便如此我仍然得到Uncaught TypeError: $(...) is not a function at...

如何在库完全加载后触发 jQuery 函数?

【问题讨论】:

  • 你只需要在jquery库加载后添加代码(脚本标签)
  • 当 jQuery 没有 加载时你会得到那个错误。首先加载 jQuery,然后按照 @PranavCBalan 的建议添加其余部分。另外,如果您只是将函数包装在 $(document).ready( 中,您应该 90% 的时间都可以。
  • 是的。我不能只放在 lib 之后,因为我正在异步加载 lib 以满足 Google PageSpeed Insights 要求

标签: javascript jquery html


【解决方案1】:

您需要在使用脚本标签加载jQuery库后添加脚本。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
  // your code should be here
  alert(typeof jQuery)
</script>

document ready handler 用于仅在加载 DOM 元素后执行代码。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
  console.log('Outside document ready handler ' + $('.test').length)

  $(document).ready(function() {
    console.log('Inside document ready handler ' + $('.test').length)
  });
</script>
<div class="test"></div>

更新1:如果脚本在文件中,您可以使用defer,请参考以下问题:jquery loaded async and ready function not working


更新 2: 或者您可以使用 addEventListener 方法将 load 事件处理程序绑定到脚本标记。

<script async id="script" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
  document.getElementById('script')
    .addEventListener('load', function() {
      alert(typeof jQuery)
    });
</script>

仅供参考:我不知道你为什么要这样做,为了优化内容加载的速度,最好将脚本标签移动到 body 的末尾,这有助于加载内容首先。

【讨论】:

  • 谢谢。但正如问题中所述,我必须异步加载 jQuery。
  • 当然。编辑了帖子。
  • 感谢您的宝贵时间和帮助。
  • “绑定”解决方案非常适合我的用例 - 从控制台运行一段脚本以将 jQuery 注入页面,然后运行 ​​jQuery 特定的函数(一旦它们可用)。谢谢你的解决方案,@PranavCBalan
【解决方案2】:

你可以这样做:

function checkVariable(){
   if ( window.jQuery){
      Do your jquery stuff here
   }
   else{
      window.setTimeout("checkVariable();",100);
   }
}
checkVariable();

抱歉格式化...现在卡在我的手机上。

【讨论】:

  • 你需要把windows.setTimeout改成window.setTimeout
  • 这在一个特定项目中非常有效,我只允许在正文中间插入 html、css 和 javascript(通过 PHP),但不允许在正文的末尾,这里加载了 jQuery 和其他 js 脚本。
【解决方案3】:

我没有看到此方法列出,所以我想我会使用JavaScript HTML DOM EventListener 进行演示。

示例 #1 使用 jQuery.ready() 方法:

<p id="test-jquery">jQuery Not Loaded</p>

<script>
  $(document).ready(function() {
    var elem = $('#test-jquery');
    elem.text('jQuery Is Loaded');
  });
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

此方法将不起作用,因为尚未加载 jQuery。 运行上面的例子会输出:

ERROR: {
  "message": "ReferenceError: $ is not defined",
  "filename": "https://stacksnippets.net/js",
  "lineno": 13,
  "colno": 3
}

示例 #2 使用 addEventListener() 方法:

<p id="test-jquery">jQuery Not Loaded</p>

<script>
  window.addEventListener('DOMContentLoaded', function() {
    var elem = $('#test-jquery');
    elem.text('jQuery Is Loaded');
  });
</script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

由于我们正在侦听Window DOMContentLoaded event,因此此方法将起作用。

来自Mozilla

此事件的原始目标是已加载的Document。 你可以在Window界面监听这个事件来处理它 捕获或冒泡阶段。有关本次活动的详细信息,请 请参阅文档上的页面:DOMContentLoaded 事件。

一个不同的事件,load,应该只用于检测满载 页。在 DOMContentLoaded 中使用 load 是一个常见的错误 更合适。

【讨论】:

    【解决方案4】:

    使用document.ready 或在标题中加载库。那应该可以工作。确保加载到正确的文件夹或正确的链接中。如果您使用链接来加载 jquery,请确保有 Internet 连接

    【讨论】:

    • 同步加载库时一切正常。问题是我必须用async 参数加载它。
    • 如问题中所述,是的。
    • 如果你想要那个异步的异步.. 你可以尝试在这里寻找 jQl:yterium.net/jQl-an-asynchronous-jQuery-Loader
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多