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

本文解决百度地图JSSDK在动态加载时遇到的加载不完全问题,提供了一种新的异步加载写法,确保SDK加载成功并可立即使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

百度地图官网文档介绍使用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);
    });
}

经测试,可以使用。

根据您提供的引用内容,"Uncaught ReferenceError: BMAP_EARTH_MAP is not defined"是百度地图API中的一个错误。这个错误通常意味着BMAP_EARTH_MAP这个变量没有被定义。根据您提供的引用内容,有几种可能解决这个问题的方法。 首先,根据中的提示,您需要确保在引用百度地图API的脚本链接中加上特殊字段`s=1`,例如: ``` <script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=你的密钥&s=1"></script> ``` 这个字段的作用是告诉百度地图API使用JavaScript API。如果您使用的是JavaScript API,确保链接中有这个字段。 另外,根据中的提示,您可以尝试使用另一种引用写法: ``` (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>'); })(); ``` 这种写法也是引用百度地图API的一种方式,您可以尝试使用这个写法来解决错误。 最后,根据提供的优化写法,您可以尝试使用以下函数来加载百度地图API: ```javascript function LoadBaiduMapScript() { 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 () { resolve(BMap); }; let scriptNode = document.createElement("script"); scriptNode.setAttribute("type", "text/javascript"); scriptNode.setAttribute("src", BMap_URL); document.body.appendChild(scriptNode); }); } ``` 您可以使用这个函数来异步加载百度地图API,并在加载完成后执行相应的回调函数。 综上所述,您可以尝试以上几种方法来解决"Uncaught ReferenceError: BMAP_EARTH_MAP is not defined"的问题。记得根据您的具体情况适当选择并尝试不同的方法,以找到最适合您的解决方案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [qt引用百度地图时报错“Uncaught ReferenceError: BMap is not defined](https://blog.csdn.net/pupuhetu/article/details/128515127)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaScript动态加载script方式引用百度地图APIUncaught ReferenceError: BMap is not defined...](https://blog.csdn.net/weixin_33969116/article/details/93446842)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值