Javascript 加载所有JS文件时的浏览器事件
我的AJAX应用程序基本上是一个index.html加上一堆.js模块。我的setup函数将js处理程序代码连接到适当的DOM元素。我怀疑我需要使用window.onload()而不是jquery的$(document).ready(),因为所有的.js文件都需要在连接时可用(即下载) 我的理解是,只有DOM树在$(document).ready()处准备就绪,但不能保证.js文件已经加载。对吗Javascript 加载所有JS文件时的浏览器事件,javascript,jquery,window,onload,Javascript,Jquery,Window,Onload,我的AJAX应用程序基本上是一个index.html加上一堆.js模块。我的setup函数将js处理程序代码连接到适当的DOM元素。我怀疑我需要使用window.onload()而不是jquery的$(document).ready(),因为所有的.js文件都需要在连接时可用(即下载) 我的理解是,只有DOM树在$(document).ready()处准备就绪,但不能保证.js文件已经加载。对吗 另外,我不需要多个加载处理程序;单窗口.onload()对我来说很好。这是正确的。但是window.
另外,我不需要多个加载处理程序;单窗口.onload()对我来说很好。这是正确的。但是
window.onload
也需要下载CSS和图像,所以可能有点过头了
你能做的是:
var scriptsToLoad = 0;
// for each script:
s = document.createElement('script');
s.type = "text/javascript";
s.src = "path/to/file.js";
scriptsToLoad += 1;
s.onload = function() {scriptsToLoad -= 1;};
// after all scripts are added in the code:
var timer = setInterval(function() {
if( scriptsToLoad == 0) {
clearInterval(timer);
// do stuff here
}
},25);
这是正确的。但是
window.onload
也需要下载CSS和图像,所以可能有点过头了
你能做的是:
var scriptsToLoad = 0;
// for each script:
s = document.createElement('script');
s.type = "text/javascript";
s.src = "path/to/file.js";
scriptsToLoad += 1;
s.onload = function() {scriptsToLoad -= 1;};
// after all scripts are added in the code:
var timer = setInterval(function() {
if( scriptsToLoad == 0) {
clearInterval(timer);
// do stuff here
}
},25);
不,只要同步加载脚本标记(在大多数情况下,这意味着“正常”),就可以安全地使用
$(document).ready()
。浏览器等待加载
后再继续。因此,$(document).ready()包含源代码中的所有
标记
如果脚本标记包含async
或defer
属性,则有两个例外。前面的意思是兼容浏览器可以继续呈现页面,后面的意思是在页面完成后执行脚本。否,只要同步加载脚本标记(在大多数情况下,这意味着“正常”),您就可以安全地使用$(document).ready()
。浏览器等待加载
后再继续。因此,$(document).ready()包含源代码中的所有
标记
如果脚本标记包含async
或defer
属性,则有两个例外。前面的意思是兼容浏览器可以继续呈现页面,后面的意思是在页面完成时执行脚本。在这种情况下,您肯定会有误解。在body标记关闭之前包含脚本标记被认为是最佳实践的全部原因是因为脚本加载是阻塞加载。除非另有特别编码(即google analytics),否则JavaScript文件是同步加载的
也就是说,如果脚本文件之间存在依赖关系,那么加载文件的顺序可能很重要。在这种情况下,您肯定会有误解。在body标记关闭之前包含脚本标记被认为是最佳实践的全部原因是因为脚本加载是阻塞加载。除非另有特别编码(即google analytics),否则JavaScript文件是同步加载的
也就是说,如果脚本文件之间存在依赖关系,则加载文件的顺序可能很重要。I测试文件:
syncscript.html
<html>
<head>
<title></title>
<style type="text/css">
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(window).load(function(){
$(document.body).append('<p>window.load has run.');
});
$(document).ready(function(){
$(document.body).append('<p>document.ready has run.');
});
</script>
</head>
<body>
<p>Page has loaded. Now continuing page load and attempting to load additional script file (after 10 second pause).</p>
<script type="text/javascript">
var p = document.createElement('p');
p.innerHTML = '<p>Inline script preceding jssleep.php file has run.</p>';
document.body.appendChild(p);
</script>
<script type="text/javascript" src="http://jfcoder.com/test/jssleep.php"></script>
<script type="text/javascript">
var p = document.createElement('p');
p.innerHTML = '<p>This is an inline script that runs after the jssleep.php script file has loaded/run.</p>';
document.body.appendChild(p);
</script>
</body>
</html>
$(窗口)。加载(函数(){
$(document.body).append(“window.load已运行”);
});
$(文档).ready(函数(){
$(document.body).append(“document.ready已运行”);
});
页面已加载。现在继续页面加载并尝试加载其他脚本文件(暂停10秒后)
var p=document.createElement('p');
p、 innerHTML='jssleep.php文件前面的内联脚本已运行。';
文件.正文.附件(p);
var p=document.createElement('p');
p、 innerHTML='这是一个内联脚本,在jssleep.php脚本文件加载/运行后运行。';
文件.正文.附件(p);
jssleep.php
<?php
header("content-type: text/javascript");
sleep(10);
?>
var p = document.createElement('p');
p.innerHTML = '<p>jssleep.php script file has loaded and run following <?php sleep(10); ?>.</p>';
document.body.appendChild(p);
var p=document.createElement('p');
p、 innerHTML='jssleep.php脚本文件已加载并运行以下?php sleep(10);?> ",;
文件.正文.附件(p);
这将输出(在Firefox中):
页面已开始加载。现在继续页面加载并尝试
加载其他脚本文件(暂停10秒后)
jssleep.php文件前面的内联脚本已运行
jssleep.php脚本文件已加载并运行以下命令
这是在jssleep.php脚本文件之后运行的内联脚本
已加载/运行
$(document).ready()已运行
$(window).load()已运行
I文件作为测试:
syncscript.html
<html>
<head>
<title></title>
<style type="text/css">
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(window).load(function(){
$(document.body).append('<p>window.load has run.');
});
$(document).ready(function(){
$(document.body).append('<p>document.ready has run.');
});
</script>
</head>
<body>
<p>Page has loaded. Now continuing page load and attempting to load additional script file (after 10 second pause).</p>
<script type="text/javascript">
var p = document.createElement('p');
p.innerHTML = '<p>Inline script preceding jssleep.php file has run.</p>';
document.body.appendChild(p);
</script>
<script type="text/javascript" src="http://jfcoder.com/test/jssleep.php"></script>
<script type="text/javascript">
var p = document.createElement('p');
p.innerHTML = '<p>This is an inline script that runs after the jssleep.php script file has loaded/run.</p>';
document.body.appendChild(p);
</script>
</body>
</html>
$(窗口)。加载(函数(){
$(document.body).append(“window.load已运行”);
});
$(文档).ready(函数(){
$(document.body).append(“document.ready已运行”);
});
页面已加载。现在继续页面加载并尝试加载其他脚本文件(暂停10秒后)
var p=document.createElement('p');
p、 innerHTML='jssleep.php文件前面的内联脚本已运行。';
文件.正文.附件(p);
var p=document.createElement('p');
p、 innerHTML='这是一个内联脚本,在jssleep.php脚本文件加载/运行后运行。';
文件.正文.附件(p);
jssleep.php
<?php
header("content-type: text/javascript");
sleep(10);
?>
var p = document.createElement('p');
p.innerHTML = '<p>jssleep.php script file has loaded and run following <?php sleep(10); ?>.</p>';
document.body.appendChild(p);
var p=document.createElement('p');
p、 innerHTML='jssleep.php脚本文件已加载并运行以下?php sleep(10);?> ",;
文件.正文.附件(p);
这将输出(在Firefox中):
页面已开始加载。现在继续页面加载并尝试
加载其他脚本文件(暂停10秒后)
jssleep.php文件前面的内联脚本已运行
jssleep.php脚本文件已加载并运行以下命令
这是在jssleep.php脚本文件之后运行的内联脚本
已加载/运行
$(document).ready()已运行
$(window).load()已运行
这可能会有帮助:。难道你不能先加载所有支持的.jS文件(首先放置它们的标记),然后让连接所有处理程序代码的代码位于该文件下方吗