我想知道是否有任何可用资源描述浏览器的光标如何执行 Javascript。
我知道它会在页面加载时加载和执行标记,并且您可以将函数附加到各种窗口事件,但是事情变得模糊的地方是,例如,我通过 AJAX 检索远程页面并将其内容放入分区
如果该远程页面必须加载脚本库,例如 <script src="anotherscript.js" />
,什么时候加载“anotherscript.js”并执行其内容?
如果我在当前页面上包含“anotherscript.js”,然后加载一些包含此脚本的重复包含的远程内容,会发生什么情况?会覆盖原来的吗?如果原始“anotherscript.js”中有一个 var,我更改了它的值,然后重新加载该文件,我会丢失原始值还是忽略此脚本的第二次包含?
如果我通过 AJAX 加载一些程序化 Javascript,它什么时候执行?在我做完之后立即 mydiv.innerHTML(remoteContent)
?还是在此之前执行?
最佳答案
答案因脚本标签的位置和添加方式而异:
与您的标记内联的脚本标记与浏览器对该标记的处理同步执行(除了,请参阅 #2),因此如果 - 例如 - 这些标记引用外部文件,它们往往会减慢速度页面的处理。 (这样浏览器就可以处理
document.write
语句,这些语句会更改它们正在处理的标记。)带有
defer
的脚本标签在某些浏览器上,属性可能要等到 DOM 完全呈现后才会执行。自然这些不能用document.write
. (同样有一个async
属性使脚本异步,但我不太了解它或它的支持程度;details。)您在 DOM 加载后(通过
innerHTML
和类似方式)分配给元素的内容中的脚本标记根本不会执行,除非您使用 jQuery 或 Prototype 等库来为您执行此操作。 (除了 Andy E 指出的一个异常(exception):在 IE 上,如果它们具有defer
属性,它将执行它们。在其他浏览器中不起作用。)如果您附加一个实际的
script
通过Element#appendChild
添加到文档中,浏览器立即开始下载该脚本,并在下载完成后立即执行。以这种方式添加的脚本不会同步执行,也不一定按顺序执行。首先附加一个<script type="text/javascript" src="MyFct.js"></script>
, 然后追加<script type="text/javascript">myFunction();</script>
很可能在远程(第一个)之前执行内联(第二个)。如果发生这种情况并且MyFct.js
声明myFunction()
,当我们尝试将它与内联脚本一起使用时,它不会被定义。如果您需要按顺序完成事情,您可以通过观察load
来判断何时加载了远程脚本。和readyStateChange
script
上的事件您添加的元素(load
是大多数浏览器上的事件,readyStateChange
是某些版本的 IE 上的事件,有些浏览器同时执行这两种操作,因此您必须为同一脚本处理多个通知)。当相关事件发生时,在属性 (
<a href='#' onclick='myNiftyJavaScript();'>
) 上而不是在脚本标记中执行事件处理程序中的脚本。
我正在忙于我的 Real Job,突然我的后脑说“你知道,你被告诉如果你将他们分配给 innerHTML
他们就不会被执行,但是你有没有亲自检查过?”我没有,所以我做了 -- FWIW:
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Script Test Page</title>
<style type='text/css'>
body {
font-family: sans-serif;
}
</style>
<script type='text/javascript'>
function addScript()
{
var str, div;
div = document.getElementById('target');
str = "Content added<" + "script type='text/javascript'>alert('hi there')<" + "/" + "script>";
alert("About to add:" + str);
div.innerHTML = str;
alert("Done adding script");
}
</script>
</head>
<body><div>
<input type='button' value='Go' onclick='addScript();'>
<div id='target'></div>
</div></body>
</html>
来自脚本的警报不会出现在 IE7、FF3.6 或 Chrome4 上(我没有费心去检查其他人,我本来是要工作的:-))。而如果您附加元素,如图所示 here , 脚本被执行。
关于javascript - 浏览器什么时候执行Javascript?执行光标如何移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2342974/