需求:當百度地圖在內網中也能使用。
分析:js判斷是否聯網,然后根據聯網狀態加載不同js。
失敗案例:
1、直接document.write
<script language="javascript">
document.write("<script src='xxx.js'><\/script>");
</script>
2、動態改變已有script的src屬性
<script src='' id="s1"></script>
<script language="javascript">
<script language="javascript">
s1.src="xxx.js"
</script>
3、動態創建script元素
<script>
var oHead = document.getElementsByTagName('HEAD').item(0);
var oScript= document.createElement("script");
oScript.type = "text/javascript";
oScript.src="xxx.js";
oHead.appendChild( oScript);
</script>
var oHead = document.getElementsByTagName('HEAD').item(0);
var oScript= document.createElement("script");
oScript.type = "text/javascript";
oScript.src="xxx.js";
oHead.appendChild( oScript);
</script>
失敗原因:這三種方法都是異步執行的,也就是說,在加載這些腳本的同時,主頁面的腳本繼續運行。導致下面的new BMap.Map()直接報錯。正確的思路是用函數回調保證js加載完畢后繼續執行后面代碼。
正解:
需要js文件:Jquery.js,Ping.js
<script language="javascript"> $(function(){ var p = new Ping(); p.ping("http://api.map.baidu.com", function(err, data) { if (err) { //離線 $.getScript("http://127.0.0.1:80/bdmap/js/apiv2.0.min.js",function(){ //加載內網js,成功后執行回調函數 $("<link>").attr({ rel: "stylesheet",type: "text/css",href: "http://127.0.0.1:80/bdmap/css/bmap.css"}).appendTo("head"); //引入css loadMap(); }); //加載js文件 }else{ //在線 $.getScript("http://api.map.baidu.com/api?v=2.0&ak=xxxxxxxxx",function(){ //加載在線js,成功后執行回調函數 loadMap(); }); //加載js文件 } }); }); </script>
用Ping.js判斷是否聯網。用Jquery的$.getScript( url [, success(script, textStatus, jqXHR) ] )加載js。如果引入的js和其他js必須按照一定順序則在$.getScript()回調函數中再執行$.getScript()。