<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è)置,否則頁(yè)面加載時(shí)不會(huì)執(zhí)行。
<script type="text/javscrpt">//<![CDATA[alert(tmp); //輸出 undefinedvar 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('alert(2);') document.write('alert("我是" + 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è)問(wèn)題,可以利用HTML解析是解析完一個(gè)HTML標(biāo)簽,再執(zhí)行下一個(gè)的原理,把代碼拆分來(lái)實(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('alert(2);') document.write('alert("我是" + 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級(jí)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('alert(2);')document.write('alert("我是" + tmpStr);');document.write('<//script>');//]]></script><script type="text/javascript">//<![CDATA[alert(3);//]]></script>這樣IE就不報(bào)錯(cuò)了,輸出值的順序變成:1、3、2、我是1
當(dāng)HTML解析器遇到一個(gè)腳本,它必須按常規(guī)終止對(duì)文檔的解析并等待腳本執(zhí)行。為了解決這個(gè)問(wèn)題HTML4標(biāo)準(zhǔn)定義了defer。通過(guò)defer來(lái)提示瀏覽器可以繼續(xù)解析HTML文檔,并延遲執(zhí)行腳本。這種延遲在腳本從外部文件載入時(shí)非常有用,讓瀏覽器不必等待外部文件全部載入之后才繼續(xù)執(zhí)行,能有效的提高性能。IE是目前唯一支持defer屬性的瀏覽器,但I(xiàn)E并沒(méi)有正確的實(shí)現(xiàn)了defer屬性,因?yàn)檠舆t的腳本總是被延遲,直到文檔結(jié)束,而不是只延遲到下一個(gè)非延遲的腳本。這意味著,IE中延遲的腳本的執(zhí)行順序相當(dāng)混亂,并且不能定義任何后面非延遲腳本并須的函數(shù)和變量。在IE中所有的defer的腳本執(zhí)行時(shí)間應(yīng)該都是HTML文檔樹(shù)建立以后,window.onload之前。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注