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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我想知道是否有任何可用资源描述浏览器的游标如何执行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使脚本异步的属性,但我对它不甚了解,或者它的支持程度如何; 细节。)
  3. 在DOM加载之后(通过innerHTML和类似的)你赋给元素的内容中的脚本标记完全不会被执行,除非你使用像jQuery或Prototype这样的库来为你做。(Andy E指出的一个例外:在IE上,如果他们有一个defer属性,它会执行它,在其他浏览器中不起作用。)
  4. 如果您通过实际script元素添加到文档中Element#appendChild,浏览器将立即下载该脚本,并在下载完成后立即执行该脚本。以这种方式添加的脚本不会同步执行,也不一定按顺序执行。首先附加一个<script type="text/javascript" src="MyFct.js"></script>,然后追加<script type="text/javascript">myFunction();</script>可能在远程(第一个)之前执行内联(第二个)。如果发生这种情况并MyFct.js声明myFunction(),当我们尝试将它与内联脚本一起使用时,它将不会被定义。如果您需要按顺序完成任务,则可以通过观察添加的元素loadreadyStateChange事件来判断何时加载了远程脚本script(这load是大多数浏览器上的事件,readyStateChange 在某些版本的IE浏览器上,有些浏览器都是这样做的,所以你必须为同一个脚本处理多个通知)。
  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()。如果脚本声明全局(窗口)变量,则旧值将被覆盖。

脚本标签按其出现的顺序进行处理。当然,脚本块内部的代码可能会被设置,以至于它在初始执行时会执行的操作是将实际处理推迟到稍后。许多jQuery设置/初始化代码都可以做到这一点。

扫码关注云+社区