打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用requirejs 调用百度地图解决方案

百度地图的模块化加载方案

百度地图的加载方式比较奇葩,比如百度提供的一个 js 脚本地址是这样http://api.map.baidu.com/api?v=2.0&ak=mXijumfojHnAaN2VxpBGoqHM,直接使用浏览器访问,这个文件的内容是这样:

(function () {    window.BMap_loadScriptTime = (new Date).getTime();    document.write('<script type="text/javascript" src="//api.map.baidu.com/getscript?v=2.0&ak=mXijumfojHnAaN2VxpBGoqHM&services=&t=20160503160001"></script>');})();
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

百度地图通过一个脚本再去请求另外一个脚本,这样的方式可能是我见的少吧,感觉这样会比较安全。 
在直接访问后面这个网址,得到的就是真正的百度地图api文件了。

看起来好像直接转成 requirejs 加载的方式没有问题,那就试试?

// requirejs 的配置,因为百度地图是非AMD模式的,所以需要加上shim进行转换require.config({    paths: {        'BMap': ['http://api.map.baidu.com/api?v=2.0&ak=mXijumfojHnAaN2VxpBGoqHM'],    },    shim: {        'BMap': {            deps: ['jquery'],            exports: 'BMap'        }    }});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
// 调用百度地图define(['jquery','BMap'], function(){    var map = new BMap.Map("map");});
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

来了来了,控制台非常精准的出现了错误:

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.ReferenceError: BMap is not defined(…)defineUncaught ReferenceError: BMap is not defined
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第一个和第四个是控制台打印出来的错误信息,中间两个是 requirejs 打印出来的错误信息。其中第一个错误只是黄色的感叹号(因为当前请求的文件已经加载,大概是提醒你异步加载的文件是不能再请求脚本的);最后一个错误是红色的叉,因为这里找不到BMap这个对象。

好了,大概问题知道了。如何解决?

经过大量的查找,发现 requirejs 有async这样一个插件,附上 requirejs 插件列表:https://github.com/requirejs/requirejs/wiki/Plugins 
这个插件可以使当前加载的 js 脚本采用异步的方式加载更多的脚本文件,官方原话是这样的:

async : Useful for JSONP and asynchronous dependencies (e.g. Google Maps).

所以配置好 async.js

require.config({    paths: {        'async': '../../lib/require/async'    }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

调用百度地图的时候这样写:

// 调用百度地图define(['jquery','async!BMap'], function(){    var map = new BMap.Map("map");});
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

这样就能成功的使用模块化的技术调用百度地图了

附上个人博客对应博文地址: 
http://lancelot_lewis.coding.me/2016/05/24/requirejs/requirejs-map/

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
html5定位并在百度地图上显示的示例
app页面中使用插件嵌入百度地图
你可能用到的百度地图效果(附源码)
百度地图API详解之地图API加载方式
使用百度地图API在页面添加百度地图应用
手机端/网页 嵌套百度地图
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服