我想知道是否有任何可用资源描述浏览器的光标如何执行Javascript.
我知道它会在页面加载时加载并执行标记,并且您可以将函数附加到各种窗口事件,但事情变得模糊的是,例如,我通过AJAX检索远程页面并将其内容放入div中.
如果该远程页面必须加载脚本库,例如<script src="anotherscript.js" />何时加载"anotherscript.js"并且其内容正在执行?
如果我在当前页面上包含"anotherscript.js",然后我加载了一些包含此脚本的重复内容的远程内容,会发生什么?它会覆盖原来的吗?如果原始的"anotherscript.js"中有一个var,其值已更改,然后我重新加载该文件...我会丢失原始值还是忽略了第二次包含此脚本?
如果我通过AJAX加载一些程序性的Javascript,它什么时候执行?我做完之后马上mydiv.innerHTML(remoteContent)?还是在此之前执行?
T.J*_*der 54
答案取决于脚本标记的位置以及添加方式:
与标记内联的脚本标记与浏览器对该标记的处理同步执行(除了,参见#2),因此,如果 - 例如 - 这些标记引用外部文件,它们往往会减慢页面的处理速度.(这样浏览器就可以处理document.write语句,这会改变他们正在处理的标记.)
defer在某些浏览器上,具有该属性的脚本标记可能在完全呈现DOM之后才会执行.当然这些都不能使用document.write.(类似地,有一个async属性使脚本异步,但我不太了解它或它支持的程度如何; 详情.)
在DOM加载(通过innerHTML和类似)之后,您分配给元素的内容中的脚本标记根本不会被执行,除非您使用像jQuery或Prototype这样的库来为您完成.(Andy E指出了一个例外:在IE上,如果它们有一个defer属性,它将执行它们.在其他浏览器中不起作用.)
如果您通过实际script元素附加到文档Element#appendChild,浏览器会立即开始下载该脚本,并在下载完成后立即执行.以这种方式添加的脚本不会同步执行或必须按顺序执行.首先附加a <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();'>当相关事件发生时,将执行属性()而不是脚本标记中的事件处理程序内的脚本.
我正在努力工作,突然我的后脑说:"你知道,你被告知如果你分配他们就不会被处决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>
Run Code Online (Sandbox Code Playgroud)
来自脚本的警报不会出现在IE7,FF3.6或Chrome4上(我没有费心去检查别人,我打算工作:-)).如果您附加此处所示的元素,则会执行脚本.
| 归档时间: |
|
| 查看次数: |
34903 次 |
| 最近记录: |