查看: 69|回覆: 0

JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined

[複製鏈接]

2

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2010-7-16
發表於 2019-5-11 16:26:00 | 顯示全部樓層 |閲讀模式

百度地图官网文档介绍使用JSSDK时,仅提供了2种引入方式:

  • script引入
  • 异步加载

实际工作场景中仅某一两个页面或者只是单纯有功能需要用到百度地图,所以没有必要在 index.html 中全局引用。

利用之前博客所写的JavaScript---动态加载script和style样式 进行操作,发现如下错误:

Failed to execute 'write' on 'Document': 
It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened

实际上百度地图JSSDK没有真正加载成功,按F12打开控制台看加载的资源,发现并没有加载完整。

根据百度API开发文档的提示,引用写法是 http://api.map.baidu.com/api?v=3.0&ak=您的密钥 ,打开后内容如下:

(function(){ 
window.BMap_loadScriptTime = (new Date).getTime(); 
document.write('<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=3.0&ak=您的密钥&services=&t=20180102163224"></script>');
})();

网上搜集的说法是说,此时页面的dom已经全部加载完了,关闭了加载通道,document.write不能异步了,所以加载不上去。

经过优化后,我找到了一个新的写法:

function LoadBaiduMapScript() {
    //console.log("初始化百度地图脚本...");
    const AK = 你的密钥;
    const BMap_URL = "https://api.map.baidu.com/api?v=2.0&ak="+ AK +"&s=1&callback=onBMapCallback";
    return new Promise((resolve, reject) => {
        // 如果已加载直接返回
        if(typeof BMap !== "undefined") {
            resolve(BMap);
            return true;
        }
        // 百度地图异步加载回调处理
        window.onBMapCallback = function () {
            console.log("百度地图脚本初始化成功...");
            resolve(BMap);
        };
        // 插入script脚本
        let scriptNode = document.createElement("script");
        scriptNode.setAttribute("type", "text/javascript");
        scriptNode.setAttribute("src", BMap_URL);
        document.body.appendChild(scriptNode);
    });
}

经测试,可以使用。



来源:https://www.cnblogs.com/yangzhengier/p/10849087.html
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部