Javascript 未定义使用异步不工作$
如果我在下面的脚本标记中使用async,我会出错Javascript 未定义使用异步不工作$,javascript,asynchronous,Javascript,Asynchronous,如果我在下面的脚本标记中使用async,我会出错 <script async src="main.js"></script> 如果我从脚本标记中删除了async,那么我的控制台中就不会再有错误,而且一切正常 你知道我为什么会有这个问题吗 编辑 下面的脚本放置在head标记内 <!-- JS --> <script async src="../js/jquery/jquery-1.10.1.min.js"> </script> &
<script async src="main.js"></script>
如果我从脚本标记中删除了async,那么我的控制台中就不会再有错误,而且一切正常
你知道我为什么会有这个问题吗
编辑
下面的脚本放置在head标记内
<!-- JS -->
<script async src="../js/jquery/jquery-1.10.1.min.js"> </script>
<script async src="../js/vendor/modernizr-2.8.2.min.js"></script>
<script async src="../js/asynchronous-resources/2014-06-03-asynchronous-resources.js"></script>
<!-- IE JS -->
<!--[if !IE]><!--><script async src="../js/ie10.js"></script><!--<![endif]-->
main.js将添加到页脚
<script async src="../js/main.js"></script>
我在stackoverflow上发现了一个类似的问题。
我不得不更改async以推迟firefox、chrome和IE9中的问题
Byt完全突破了IE8和IE7。如果我使用defer,jQuery将停止工作。我猜是main.js中有一些jQuery。async标记将强制浏览器在JavaScript可用时立即解析它,这可能是在jQuery脚本准备就绪之前 发件人: 当存在时,它指定将执行脚本 一旦可用,就立即异步执行 要解决的问题:
- 除了main.js之外,还向jQuery添加async属性
- 从main.js中删除async属性
- 完全删除异步标记
如果您提供更多关于您正在使用的异步标记的信息,我可以提供更多建议。您的
main.js
甚至在jquery同步加载之前就已经异步执行了
也可以向jquery添加async
属性,或者从main.js
设置此布尔属性以指示浏览器应
如果可能,异步执行脚本。这对我没有影响
内联脚本(即没有src属性的脚本)
好的。。。。。
所以基本上
没有异步:
JS文件按顺序下载和执行。。。i、 例如,首先下载并执行遇到的第一个JS文件,然后执行下一个,依此类推,而此时HTML解析器被阻止,这意味着HTML呈现没有进一步的进展
使用异步:
JS文件[all]在遇到时被异步下载,并在完全下载后立即执行。HTML解析器在下载时不会被阻止。因此HTML呈现更加渐进
缺点:
但是,异步下载和执行的问题是JS文件一下载就执行。。。i、 例如,一个较小的JS文件(main.JS)在较大的文件(jQuery.JS)执行之前被下载。
因此,如果我的小文件引用了在大文件中初始化的某个变量/代码($of jQuery),唉,代码还没有初始化,因此会抛出一个错误。这就是这里正在发生的事情
你应该做什么:
1> 删除async属性并以较低的性能生存。2> 使用维护执行顺序的脚本动态加载。默认情况下,动态脚本以异步方式下载,但与DOM解析分开执行,因此不会阻止HTML呈现。在这种情况下,通过写作
script.async = false;
我们强制下载这些文件并按顺序执行
<script type="text/javascript">
[
'jQuery.js',
'main.js'
].forEach(function(src) {
var script = document.createElement('script');
script.src = src;
script.async = false;
document.head.appendChild(script);
});
</script>
[
“jQuery.js”,
'main.js'
].forEach(函数(src){
var script=document.createElement('script');
script.src=src;
script.async=false;
document.head.appendChild(脚本);
});
我刚刚写完jsinit.js
就是为了这个目的
它允许您使用async
,即使使用jQuery也是如此。它的工作原理是延迟模块的执行,直到jquery完成加载。(它可以自己“异步”加载!)
看看:也有同样的问题,但希望保持异步以获得更好的性能。我已经通过将所有代码从main.js移到onload函数中解决了这个问题。像这样:
window.onload = function () {
// main.js code
};
这样,main.js代码只在加载页面(包括jQuery)后运行
更新:这里有另一种(更好的?)方法:
对于我来说,这种方式在ggle chrome上效果很好: 替换
借
它首先对jquery收费,然后对my.js收费,如订单要解决这个问题,您只需将所有内联代码作为函数编写即可。然后将onload属性添加到异步jQuery的脚本标记中,如下所示:
<script src="../scripts/jquery.min.js" async onload="myFunction()"></script>
确保在html myFunction的head部分中,将myFunction放在async脚本标记之前 嗯。。。同步事件不应该发生在同步事件之前吗?您的答案非常符合逻辑,而且是正确的。我已经将async添加到所有脚本标记中。即使它不起作用。我更新了我的问题。是的,你是对的。main.js里面有jquery。使用jquery不是一个好主意吗?实际上不是。对于jquery和main.js,我无法使用异步。我在堆栈上发现了一个类似的问题,这个问题已经解决了。我已经更新了我的问题。谢谢,这有助于理解异步规则。您还应该知道,
defer
属性可以用来代替async
,这将保持脚本执行顺序。
var myScript = document.createElement('script');
myScript.src = 'http://code.jquery.com/jquery-1.9.1.min.js';
myScript.onload = function() {
console.log('jQuery loaded.');
};
document.body.appendChild(myScript);
<script async src="JS/jquery-3.1.1.min.js"></script>
<script async src="JS/my.js"></script>
<script defer src="JS/jquery-3.1.1.min.js"></script>
<script defer src="JS/my.js"></script>
<script src="../scripts/jquery.min.js" async onload="myFunction()"></script>