<!--直接写在元素的事件处理程序中--><input type="button" value="点击测试一下" onclick="alert("点击了按钮")"/><!--作为URL的主体--><a href="javascript:alert("dd")">JS脚本作为URL的主体</a>第5种情况对于我们讨论的脚本执行顺序没有什么影响,因此我们这里只讨论前四种情况:
<?php$url = $_GET["url"];$delay = $_GET["delay"];if(isset($delay)){sleep($delay);}echo file_get_contents($url);?> 另外我们还定义了两个JavaScript文件,分别为1.js和2.js,在这个例子中,二者的代码分别如下:<script src="/delayfile.php?url=http://localhost/js/load/1.js&delay=3" type="text/javascript"></script><script type="text/javascript">alert("我是内部脚本");</script><script src="/delayfile.php?url=http://localhost/js/load/2.js&delay=1" type="text/javascript"></script>虽然第一个脚本延迟了3秒才会返回,但是在所有浏览器中,弹出的顺序也都是相同的,即:"我是第一个脚本"->"我是内部脚本"->"我是第二个脚本"
<script src="/delayfile.php?url=http://localhost/js/load/1.js&delay=2" type="text/javascript"></script><script type="text/javascript">document.write("<script type="text/javascript" src="/delayfile.php?url=http://localhost/js/load/2.js"></script>");document.write("<script type="text/javascript" src="/delayfile.php?url=http://localhost/js/load/1.js"></script>");alert("我是内部脚本");</script>这段代码执行完毕之后,DOM将被修改为:

而代码执行的结果也符合DOM中脚本的顺序:"我是第一个脚本"->"我是内部脚本"->"我是第二个脚本"->"我是第一个脚本"
[2]同一个<script>标签中通过document.write只写入内部脚本:
在这种情况下,通过documen.write写入的内部脚本,执行顺序的优先级与写入脚本标签内的代码相同,并且按照写入的先后顺序执行:
我们再修改HTML代码如下:
<script src="/delayfile.php?url=http://localhost/js/load/1.js" type="text/javascript"></script><script type="text/javascript">document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本")</script>");alert("我是内部脚本");document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本2222")</script>");document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本3333")</script>");</script>在这种情况下,document.write写入的脚本被认为与写入位置处的代码优先级相同,因此在所有浏览器中,弹出框的顺序均为:"我是第一个脚本"->"我是document.write写入的内部脚本"->"我是内部脚本"->"我是document.write写入的内部脚本2222"->"我是document.write写入的内部脚本3333"
<script src="/delayfile.php?url=http://localhost/js/load/1.js" type="text/javascript"></script><script type="text/javascript"> document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本")</script>"); alert("我是内部脚本"); document.write("<script type="text/javascript" src="/delayfile.php?url=http://localhost/js/load/1.js"></script>"); document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本2222")</script>"); document.write("<script type="text/javascript" src="/delayfile.php?url=http://localhost/js/load/1.js"></script>"); document.write("<script type="text/javascript">alert("我是docment.write写入的内部脚本3333")</script>"); alert("我是内部脚本2222");</script>在IE9及以下的浏览器中,上面代码执行后弹出的内容为:"我是第一个脚本"->"我是document.write写入的内部脚本"->"我是内部脚本"->"我是document.write写入的内部脚本2222"->"我是document.write写入的内部脚本3333"->"我是内部脚本2222"->"我是第一个脚本"->"我是第一个脚本"
function loadScript(url,callback){var script = document.createElement("script");script.type = "text/javascript";//绑定加载完毕的事件if(script.readyState){script.onreadystatechange = function(){if(script.readyState === "loaded" || script.readyState === "complete"){callback&&callback();}}}else{script.onload = function(){callback&&callback();}}script.src = url;document.getElementsByTagName("head")[0].appendChild(script);}但是通过动态脚本技术添加的外部JavaScript脚本不保证按照添加的顺序执行,这一点可以通过回调或者使用jQuery的html()方法,详细可参考:http://www.jb51.net/article/26446.htmvar xhr = (function(){function createXhr(){var xhr ;if(window.XMLHttpRequest){xhr = new XMLHttpRequest();}else if(window.ActiveXObject){var xhrVersions = ["MSXML2.XMLHttp","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp.6.0"], i, len;for(i = 0, len = xhrVersions.length; i < len ; i++){try{xhr = new ActiveXObject(xhrVersions[i]);}catch(e){}}}else{throw new Error("无法创建xhr对象");}return xhr;}function get(url,async,callback){var xhr = createXhr();xhr.onreadystatechange = function(){if(xhr.readyState == 4){if((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){callback&&callback(xhr.responseText);}else{alert("请求失败,错误码为" + xhr.status);}}}xhr.open("get",url,async);xhr.send(null);}return {get:get}}()) 然后基于xhr对象,再创建loadXhrScript函数:function loadXhrScript(url,async, callback){ if(async == undefined){ async = true; } xhr.get(url,async,function(text){ var script = document.createElement("script"); script.type = "text/javascript"; script.text = text; document.body.appendChild(script); });} 我们上面的get方法添加了一个参数,即是否异步,那么如果我们采用同步方法,通过Ajax注入的脚本肯定是按照添加的顺序执行;反之,如果我们采用异步的方案,那么添加的脚本的执行顺序肯定是无法确定的。