<p onclick="alert(‘我是由onclick事件執(zhí)行的Javascript‘)">點(diǎn)擊我</p>
<a href="javascript:alert(‘我是由javascript:協(xié)議執(zhí)行的javascript‘)">點(diǎn)擊我</a>
第3種和第4種方法寫入的Javascript需要觸發(fā)才能執(zhí)行,所以除非特別設(shè)置,否則頁面加載時(shí)不會執(zhí)行。
<script type="text/javscrpt">//<![CDATA[ alert(tmp); //輸出 undefined var tmp = 1; alert(tmp); //輸出 1 //]]></script>
<script type="text/javscrpt">//<![CDATA[ aa(); //瀏覽器報(bào)錯(cuò) //]]></script> <script type="text/javscrpt">//<![CDATA[ aa(); //輸出 1 function aa(){alert(1);} //]]></script>
<script type="text/javascript">//<![CDATA[ document.write(‘<script type="text/javascript" src="test.js"><\/script>‘); document.write(‘<script type="text/javascript">‘); document.write(‘a(chǎn)lert(2);‘) document.write(‘a(chǎn)lert("我是" + tmpStr);‘); document.write(‘<\/script>‘); //]]></script> <script type="text/javascript">//<![CDATA[ alert(3); //]]></script>
test.js的內(nèi)容是:
var tmpStr = 1; alert(tmpStr);
原因可能是IE在document.write時(shí),并未等待加載SRC中的Javascript代碼完畢后,才執(zhí)行下一行,所以導(dǎo)致2先彈出,并且執(zhí)行到document.write(’document.write("我是" + tmpStr)’)調(diào)用tmpStr時(shí),tmpStr并未定義,從而報(bào)錯(cuò)。
解決這個(gè)問題,可以利用HTML解析是解析完一個(gè)HTML標(biāo)簽,再執(zhí)行下一個(gè)的原理,把代碼拆分來實(shí)現(xiàn):
<script type="text/javascript">//<![CDATA[ document.write(‘<script type="text/javascript" src="test.js"><\/script>‘); //]]></script> <script type="text/javascript">//<![CDATA[ document.write(‘<script type="text/javascript">‘); document.write(‘a(chǎn)lert(2);‘) document.write(‘a(chǎn)lert("我是" + tmpStr);‘); document.write(‘<\/script>‘); //]]></script> <script type="text/javascript">//<![CDATA[ alert(3); //]]></script>
這樣IE下和其他瀏覽器輸出值的順序都是一直的了:1、2、我是1、3。
<script type="text/javascript">//<![CDATA[ window.onload = f; function f(){alert(1);} alert(2); //]]></script>
輸出值順序是 2、1。
需要注意的是,如果存在多個(gè)winodws.onload的話,只有最有一個(gè)生效,解決這個(gè)辦法是:
window.onload = function(){f();f1();f2();.....}
利用2級DOM事件類型
if(document.addEventListener){ window.addEventListener(‘load‘,f,false); window.addEventListener(‘load‘,f1,false); ... }else{ window.attachEvent(‘onload‘,f); window.attachEvent(‘onload‘,f1); ... }
<script type="text/javascript">//<![CDATA[ document.write(‘<script type="text/javascript" src="test.js"><\/script>‘); document.write(‘<script type="text/javascript" defer="defer">‘); document.write(‘a(chǎn)lert(2);‘) document.write(‘a(chǎn)lert("我是" + tmpStr);‘); document.write(‘<\/script>‘); //]]></script> <script type="text/javascript">//<![CDATA[ alert(3); //]]></script>
這樣IE就不報(bào)錯(cuò)了,輸出值的順序變成:1、3、2、我是1