最近在做QQ地图的功能。
因为不是所有页面都使用了地图,所以我就想在使用到地图的页面再加载js。
在index.html里面,这样是可以的。
但是,如果是下面这样:
<script type="text/javascript" id="qqMap"></script>
就会报错,“qq is not defined”。
我感觉是顺序的问题,所以就问了,这种追加上去的js方法真的没法用吗?
有没有更好的解决办法呢?
最近在做QQ地图的功能。
因为不是所有页面都使用了地图,所以我就想在使用到地图的页面再加载js。
在index.html里面,这样是可以的。
但是,如果是下面这样:
<script type="text/javascript" id="qqMap"></script>
就会报错,“qq is not defined”。
我感觉是顺序的问题,所以就问了,这种追加上去的js方法真的没法用吗?
有没有更好的解决办法呢?
这种按需加载方案是可行的,也是常用做法,你的问题是得确保代码是在script
成功加载之后执行,参考下我简化后的按需加载模块
map.js
const KEY = '你的地图密钥';
const onLoad = [];
let TMapInit = false;
let TMapLoad = false;
function init(libraries) {
if (!TMapInit) {
const script = document.createElement('script');
libraries = libraries || 'drawing,geometry,convertor';
script.src = `//map.qq.com/api/js?v=2.exp&key=${KEY}&libraries=${libraries}&callback=onTMapLoad`;
document.body.appendChild(script);
TMapInit = true;
}
}
/**
* 接受地图异步回调的函数
*/
window.onTMapLoad = () => {
TMapLoad = true;
onLoad.forEach(callback => {
callback && callback(window.qq.maps);
});
};
export default {
onReady(callback, libraries) {
if (!TMapLoad) {
if (!TMapInit) init(libraries);
onLoad.push(callback);
} else {
callback && callback(window.qq.maps);
}
},
}
使用
import Map from '../map.js'
Map.onReady(maps => {
//...your code
}, 'lite');
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
大致可以这样写
有一点需要注意,这一点可能是引起你的异常的原因:动态加载 script 的 js 代码,一定要写在
<script type="text/javascript" id="qqMap"></script>
的后面。这是我这边的效果: