在执行JavaScript代码之前等待所有JavaScript文件加载完成,这是否有可能?

79

我们有几个JavaScript文件,它们在主页面底部加载。然而,我遇到的情况是需要在其他脚本加载之前执行一些JavaScript。是否可以等待所有JavaScript文件加载完毕,然后执行一些JavaScript代码?

我原以为$(document).ready()可以做到这一点,但事实证明不行。当然,我们可以将脚本文件从底部移动到顶部,但我想知道是否有可能实现我的需求。


你可以在自己的脚本之后使用“脚本加载器”来完成它。 - Jared Farrish
3
我认为你想要什么并不清楚 - 你同时谈到了想在其他脚本加载之前执行X,但又想等到所有脚本都加载完。那到底是哪一个?而你想执行的X具体是什么? - Damien_The_Unbeliever
@Damien_The_Unbeliever 为了更清晰明确:我想在所有 JavaScript 文件加载完成后执行 JavaScript。 - Martijn
5个回答

129

你可以使用

$(window).on('load', function() {
    // your code here
});

这将等待页面加载完成。 $(document).ready() 将等待 DOM 加载完成。

用普通的 JS 写法:

window.addEventListener('load', function() {
    // your code here
})

3
这里有一个更好的解释:http://4loc.wordpress.com/2009/04/28/documentready-vs-windowload/ - Eruant
我的应用程序需要等待动态加载的脚本完成加载后才能生成页面内容,这个工具很好用。+1 - Yogi
8
纯粹的 JavaScript 等效代码是:window.addEventListener('load', function() { /* 在这里编写你的代码 */ }) - Dave Land
这会附加执行堆栈还是替换旧的? - Amit Shah

37

15
如果我想要标准的 JavaScript 函数而非 jQuery,代码应该怎么写? - Josua Marcel C
2
请注意,这不会缓存文件,它会每次都下载。文档中提到了$.ajaxSetup 或 $.ajax来启用缓存。 - JanErikGunnar
如果我正在加载jQuery呢? - frumbert

34

3
它似乎不等待所有其他JS文件执行完成,至少在Firefox中不是这样。 - Rolf
7
根据文档所说,在页面解析时推迟脚本加载(而不是在js/css加载时)。但这不是一个解决方案。 - Nishant

5
稍微解释一下@Eruant的回答,
$(window).on('load', function() {
    // your code here
});

使用 asyncdefer 可以很好地处理脚本的加载。

因此,您可以这样导入所有脚本:

<script src="/js/script1.js" async defer></script>
<script src="/js/script2.js" async defer></script>
<script src="/js/script3.js" async defer></script>

请确保script1$(window).on('load' ...)之前不要调用script3中的函数,确保在window load事件内调用它们。

有关异步/延迟加载,请点击此处


0

这对我有效:

var jsScripts = [];

jsScripts.push("/js/script1.js" );
jsScripts.push("/js/script2.js" );
jsScripts.push("/js/script3.js" );

$(jsScripts).each(function( index, value ) {
    $.holdReady( true );
    $.getScript( value ).done(function(script, status) {
        console.log('Loaded ' + index + ' : ' + value + ' (' + status + ')');                
        $.holdReady( false );
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接