JavaScript动态加载script方式引用百度地图API,Uncaught ReferenceError: BMap is not defined
<p>百度地图官网文档介绍使用JSSDK时,仅提供了2种引入方式:</p><ul>
<li>script引入</li>
<li>异步加载</li>
</ul>
<p>实际工作场景中仅某一两个页面或者只是单纯有功能需要用到百度地图,所以没有必要在 <code>index.html</code> 中全局引用。</p>
<p>利用之前博客所写的JavaScript---动态加载script和style样式 进行操作,发现如下错误:</p>
<div class="cnblogs_code">
<pre>Failed to execute 'write' on 'Document': <br>It isn't possible to write into a document from an asynchronously-loaded external script unless it is explicitly opened</pre>
</div>
<p>实际上百度地图JSSDK没有真正加载成功,按F12打开控制台看加载的资源,发现并没有加载完整。</p>
<p>根据百度API开发文档的提示,引用写法是 http://api.map.baidu.com/api?v=3.0&ak=您的密钥 ,打开后内容如下:</p>
<div class="cnblogs_code">
<pre>(<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(){
window.BMap_loadScriptTime </span>= (<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date).getTime();
document.write(</span>'<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=3.0&ak=您的密钥&services=&t=20180102163224"></script>'<span style="color: rgba(0, 0, 0, 1)">);
})();</span></pre>
</div>
<p>网上搜集的说法是说,此时页面的dom已经全部加载完了,关闭了加载通道,document.write不能异步了,所以加载不上去。</p>
<p>经过优化后,我找到了一个新的写法:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> LoadBaiduMapScript() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">console.log("初始化百度地图脚本...");</span>
const AK =<span style="color: rgba(0, 0, 0, 1)"> 你的密钥;
const BMap_URL </span>= "https://api.map.baidu.com/api?v=2.0&ak="+ AK +"&s=1&callback=onBMapCallback"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">new</span> Promise((resolve, reject) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 如果已加载直接返回</span>
<span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">typeof</span> BMap !== "undefined"<span style="color: rgba(0, 0, 0, 1)">) {
resolve(BMap);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 百度地图异步加载回调处理</span>
window.onBMapCallback = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> () {
console.log(</span>"百度地图脚本初始化成功..."<span style="color: rgba(0, 0, 0, 1)">);
resolve(BMap);
};
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 插入script脚本</span>
let scriptNode = document.createElement("script"<span style="color: rgba(0, 0, 0, 1)">);
scriptNode.setAttribute(</span>"type", "text/javascript"<span style="color: rgba(0, 0, 0, 1)">);
scriptNode.setAttribute(</span>"src"<span style="color: rgba(0, 0, 0, 1)">, BMap_URL);
document.body.appendChild(scriptNode);
});
}</span></pre>
</div>
<p>经测试,可以使用。</p><br><br>
来源:https://www.cnblogs.com/yangzhengier/p/10849087.html
頁:
[1]