jQuery加载的async和ready函数不工作
jQuery loaded async and ready function not working
为了优化文档的加载,我使用类似的异步加载jQuery
<script async type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
然后我使用jQuery调用一个脚本:
<script type="text/javascript">
jQuery(document).ready(function() {
App.init();
OwlCarousel.initOwlCarousel();
FancyBox.initFancybox();
StyleSwitcher.initStyleSwitcher();
});
</script>
它告诉我jquery没有定义。
我不知道我应该用什么,我想。readyfunction会等到所有文档都加载后再调用它。
Bootstrap库也是一样,它告诉我jQuery没有定义。
我试着要求在最后加载脚本,但它仍然不能正常工作。
由于jquery脚本是异步加载的,因此在执行脚本时不会加载jquery
。因此,您需要通过订阅加载事件来等待它加载,如下所示:
<script async id="jquery" type="text/javascript" src="https://code.jquery.com/jquery-2.2.3.js"></script>
然后在此元素上侦听load
事件
<script type="text/javascript">
document.getElementById('jquery').addEventListener('load', function () {
App.init();
OwlCarousel.initOwlCarousel();
FancyBox.initFancybox();
StyleSwitcher.initStyleSwitcher();
});
</script>
但我不知道为什么有人想做这样的事。
为了优化页面加载速度,最好将所有javascript放在正文的末尾,这样内容将首先加载,并且如果同步加载,脚本不会延迟页面呈现事件。
编辑:我同意这一评论,并认为前一段不是将jQuery加载到页面的最佳方式
问题脚本标记-async&defer对你的问题有很好的答案。
简而言之,当其他脚本依赖jQuery或其他库时,如果没有一些额外的异步处理来执行依赖于库的脚本,就无法异步加载jQuery或其它库。
这就是我的解决方案:
<script async type="text/javascript" src="path_to_jquery" id="jquery_script_tag">
</script>
<script>
if ( !('jQuery' in window) )
{
window.jQueryQueue = [];
//define temporary jQuery function
window.jQuery = function(){
//just save function parameters to queue
jQueryQueue.push( arguments );
}
document.getElementById('jquery_script_tag').addEventListener('load', function(){
//call jQuery with parameters saved in queue, after it loaded
for ( var i in jQueryQueue )
jQuery.apply( document, jQueryQueue[i] );
});
}
</script>
这段代码定义了一个临时jQuery函数,如果它还没有定义的话。当真正的jQuery尚未加载时,该函数将所有jQuery函数调用保存到队列中(而不是调用未定义的jQuery函数)。当jQuery加载后,它使用与以前调用的参数相同的参数调用队列中的jQuery函数。
DOMContentLoaded
事件来设置事件。
这意味着jQuery(以及任何使用$(function() {...})
的东西)必须在DOMContentLoaded
启动之前下载,否则它永远不会挂接其事件。
反过来,这意味着<script async ...
将是不可靠的,每当jQuery下载时间比页面内容长时就会崩溃。
不幸的是,由于jQuery试图在document.readyState === "interactive"
之后立即启动,<script defer ...
也无法工作。
您可以加载内容,然后通过将<script>
放在<body>
的末尾来加载jQuery,但这将导致页面出现和任何jQuery启动之间出现明显的停顿-用户将无法点击任何内容,视觉组件将不会出现,等等。
这种方式很好用:
<script charset="utf-8" type="text/javascript">
var intervalID = window.setInterval(function(){
if(window.jQuery){
clearInterval(intervalID);
console.log('Loaded');
/* Your code here */
}
},1000);
</script>
当您尝试访问Jquery时使用异步加载它未由浏览器加载您可以在页面加载完成后访问Jquery。
正常加载Jquery以解决您的问题。
- onmouseout函数工作不正常
- 我无法使onmouseout函数工作
- Javascript”;结束”;函数工作不稳定
- HTML JavaScript,我如何能够通过给每个元素一个不同的Id来使用JavaScript使这个函数工作
- Javascript:onclick函数工作一次,页面就会恢复到原来的状态
- jQuery toggle()函数工作不正常
- Node.js npm opn-can't使回调函数工作
- 添加两个数字的JavaScript函数工作不正常
- 调用在Jquery中未作为链接函数工作
- 将PHP变量传递给Javascript不能通过PHP函数工作(与全局变量无关)
- 为什么我需要在 javascript 函数工作之前按提交按钮 2 次
- 使 JavaScript 函数工作时遇到麻烦
- 如何使 clearInterval 函数工作
- 如何使 then 函数工作
- 如何让我的包含函数工作
- Promise.all 不应该作为传递给 .then 的函数工作
- 我无法让它作为 JavaScript 函数工作(我在控制台时得到我想要的返回值.log但我不能将其作为函数调用)
- JavaScript on change 函数工作得不好
- jquery next()函数工作不正常
- Jquery hasClass()函数工作不正常