最近在工作中遇到了一個奇怪的問題,在web文本前端加載js文件,在Chrome和Firefox瀏覽器中運行正常,但在IE瀏覽器中運行無法顯示效果。採用多種辦法,最後發現IE和Firefox瀏覽器兼容性互斥,於是採用了再JS文件中先辨別瀏覽器類型,然後根據不同的瀏覽器來進行不同的加載。具體如下:
<script>
function LoadJS(jsUrl, errCallBack,asyncl)
{
$.ajax({
url:jsUrl,
type:'get',
cache:false,
async:asyncl,
error:function(){
if(errCallBack && idFunction(errCallBack))
{
errCallBack();
}
}
});
}
function errCallBack()
{
}
if($.browser.mise)
{
LoadJS("xxxx.js",errCallBack,false);
}
else if(navigator.useAgent.indexOf("Safari")>0)
{
LoadJS("xxxx.js",errCallBack,true);
}
else
{
var oHead=document.getElementByTagBame('HEAD').item(0);
var oScript=document.createElement("script");
oScript.language="javascript";
oScript.type="text/javascript";
oScript.id=sId;
oScript.defer=true;
oScript.text=source;
oHead.appendChild(oScript);
}
</script>
經過了這麼多努力,發現還是存在一些問題,在Firefox瀏覽器隱身模式下進行加載時還是會出現一些問題,此時不在進行解決。查詢其他方法,無意間發現script的defer屬性,將源代碼中的的script文件的加載設置defer爲TRUE,解決所有問題,上述代碼也不在需要。在此對Javascript的defer屬性進行分析和總結:
defer屬性設置爲TRUE時,讓瀏覽器加載js腳本時不等腳本加載完成就開始對該腳本之後的其他圖片、文本、HTML代碼進行加載了,然後讓js腳本自己在慢慢加載,然後再執行。
給外鏈的JS腳本添加defer="true",其方式如下:
<script defer="true" src="xxxx.js" type="text/javascript"/>,這種方式加載JS文件能夠提高網頁的加載速度,特別是對比較大的腳本。
注意,defer="true"還可以用作defer="defer",但在XTHML格式的網頁中還是使用defer="true"比較恰當。在使用defer時應注意一下問題:
1、不要在defer型腳本程序段中調用document.write命令,因爲document.write將產生直接輸出效果。
2、不要在defer型腳本程序段中包括任何立即執行腳本要使用的全局變量或者函數。