浏览器何时执行Javascript? 执行光标如何移动?

我想知道是否有任何可用的资源,描述浏览器的游标如何执行JavaScript。

我知道它在加载页面时加载和执行标签,并且可以将函数附加到各种窗口事件,但是当事情变得模糊的时候,例如,我通过AJAX检索远程页面并将其内容放入div中。

如果这个远程页面需要加载脚本库,如<script src="anotherscript.js" /> ,那么“anotherscript.js”何时被加载并且其内容正在被执行?

如果我在当前页面上包含“anotherscript.js”会发生什么情况,然后加载一些包含此脚本的重复的远程内容? 它覆盖原来的? 如果原始的“anotherscript.js”有一个var其值,我改变了,然后我重新加载该文件…如果我失去了原来的价值,或者是这个脚本被忽略的第二个包含?

如果我通过AJAX加载一些程序化的Javascript,它什么时候执行? 我做mydiv.innerHTML(remoteContent)之后立即? 还是在这之前执行?

答案因脚本标签的位置以及添加方式而异:

  1. 与标记内联的脚本标记与浏览器对该标记的处理同步执行(除#2外),所以如果 – 例如 – 这些标记引用外部文件,它们往往会减慢页面的处理速度。 (这样浏览器就可以处理document.write语句,这会更改他们正在处理的标记。)

  2. 具有defer属性的脚本标记可能在一些浏览器上不能被执行,直到DOM完全呈现之后。 当然,这些不能使用document.write 。 (类似的,有一个async属性,使脚本asynchronous,但我不太了解它或支持多么好; 细节 。)

  3. 在DOM加载之后(通过innerHTML和类似的),你分配给元素的内容中的脚本标记根本不会被执行,除非你使用像jQuery或Prototype这样的库来为你做。 (Andy E指出的一个例外:在IE上,如果它们有一个defer属性,它将执行它们,在其他浏览器中不起作用。

  4. 如果通过Element#appendChild将实际script元素附加到文档中,则浏览器立即开始下载该脚本,并在下载完成后立即执行该脚本。 以这种方式添加的脚本不会同步执行,也不一定按顺序执行。 首先追加一个<script type="text/javascript" src="MyFct.js"></script> ,然后追加<script type="text/javascript">myFunction();</script>内联(第二个)在远程(第一个)之前。 如果发生这种情况, MyFct.js声明了myFunction() ,当我们尝试将它与内联脚本一起使用时,它将不会被定义。 如果您需要按顺序完成某些工作,则可以通过观察添加的script元素上的loadreadyStateChange事件来了解何时加载了远程脚本( load是大多数浏览器上的事件,某些版本的IE上的readyStateChange ,以及某些浏览器做两个,所以你必须处理同一个脚本的多个通知)。

  5. 在相关事件发生时执行属性( <a href='#' onclick='myNiftyJavaScript();'> )事件处理程序中的脚本而不是脚本标记。


我正在离开我的真实工作,突然我的后脑说:“你知道,你被告知如果你把它们分配给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上没有出现脚本警报(我没有打扰到检查其他人,我打算工作:-))。 而如果你像这里所示追加元素,脚本就会被执行。

如果只是用“innerHTML”将包含脚本标记的HTML块填充到DOM中,脚本标记将不会被执行。 当你用jQuery之类的东西加载东西时,那个库中的代码显式地处理查找和执行脚本。

这并不准确,但基本上可以考虑处理<script>标签,就好像标签的全部内容(即脚本主体)是用eval()执行的。 如果脚本声明全局(窗口)variables,则旧值将被覆盖。

脚本标记按它们出现的顺序进行处理。 当然,脚本块内部的代码可以被设置,以便它在初始执行时执行的是将实际处理推迟到稍后。 大量的jQuery设置/初始化代码将做到这一点。