Javascript运行和DOM加载
以下代码是.php文件的一部分。另一个php文件ribbon.php使用json格式通过ajax调用返回数据。每当我运行这段代码时,一切都正常。然而,results\u ribbon实际上并不存在于这个特定的代码点中。当然,由于ajax调用是异步的,所以代码不会等待ajax完成,而是继续进行随后的DOM加载。当函数callit到达事件队列时,results\u ribbon已经存在,因此没有问题Javascript运行和DOM加载,javascript,ajax,dom,Javascript,Ajax,Dom,以下代码是.php文件的一部分。另一个php文件ribbon.php使用json格式通过ajax调用返回数据。每当我运行这段代码时,一切都正常。然而,results\u ribbon实际上并不存在于这个特定的代码点中。当然,由于ajax调用是异步的,所以代码不会等待ajax完成,而是继续进行随后的DOM加载。当函数callit到达事件队列时,results\u ribbon已经存在,因此没有问题 ... <script type="text/javascript">
...
<script type="text/javascript">
$.ajax({
method:"POST",
dataType: 'json',
url:"ribbon.php",
success: function callit(data) {
if (data === "nothing")
return;
$("#results_ribbon").text(data);
}
});
</script>
...
<div id="results_ribbon"></div>
...
。。。
$.ajax({
方法:“张贴”,
数据类型:“json”,
url:“ribbon.php”,
成功:函数callit(数据){
如果(数据==“无”)
返回;
$(“#结果"功能区”)。文本(数据);
}
});
...
...
然而,为了深入了解这是如何工作的,我对上述代码做了如下更改:
<script type="text/javascript">
$.ajax({
method:"POST",
dataType: 'json',
url:"ribbon.php",
success: function callit(data) {
if (data === "nothing")
return;
$("#results_ribbon").text(data);
}
});
var ms = 5000 + new Date().getTime();
while (new Date() < ms)
{}
</script>
$.ajax({
方法:“张贴”,
数据类型:“json”,
url:“ribbon.php”,
成功:函数callit(数据){
如果(数据==“无”)
返回;
$(“#结果"功能区”)。文本(数据);
}
});
var ms=5000+新日期().getTime();
while(新日期()
这样,我就有时间完成ajax调用,我认为事件循环会优先于DOM调用callit,因此结果将是未知的。然而,我的想法只适用于Chrome;在Mozilla和IE中,一切都像第一个案例一样运行!我无法推断出
有人能向我解释一下或指出一些阅读资料来源,当Javascript代码在同一个文件中共存时,它们是如何干扰DOM加载的?哪一个具有优先权?浏览器是否可以以并行方式同时加载这两个文件
谢谢你JS是单线程的,我认为所有进程都在排队,直到while循环中断(异步代码也是如此)。您可以通过记录while循环完成的时间和实际调用ajax回调的时间来检查它,它将在while日志之后几毫秒,由于初始DOM加载是在异步调用之前启动的同步进程,因此该元素是可用的,这是有意义的。我们开始加载DOM,然后使用AJAX和循环编写JS代码,然后继续DOM渲染的其余部分,最后可以运行任何异步操作。我不相信会有任何特殊的优先级。JS是单线程的,我认为所有进程都会排队,直到while循环中断(异步代码也是如此)。您可以通过记录while循环完成的时间和实际调用ajax回调的时间来检查它,它将在while日志之后几毫秒,由于初始DOM加载是在异步调用之前启动的同步进程,因此该元素是可用的,这是有意义的。我们开始加载DOM,然后使用AJAX和循环编写JS代码,然后继续DOM渲染的其余部分,最后可以运行任何异步操作。我不相信有任何特别的优先权。