3

我正在动态加载Bing Map API脚本。脚本完成加载后,我想构建我的地图。问题是Microsoft并且Microsoft.Maps已经定义,但Microsoft.Maps.Map不是。我意识到他们的脚本会异步加载更多脚本,但即使在等待这些额外的假设脚本 10 秒后,Microsoft.Maps.Map仍然未定义。那么我该如何加载他们的Map课程呢?我在他们的示例中看不到任何显式加载类的内容。

Javascript(原型框架):

var script = new Element(
    'script', {
        type: 'text/javascript',
        src: 'http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0'
    }
);

script.observe(
    'load',
    function(event) {
        console.info(Microsoft);
        console.info(Microsoft.Maps);
        console.info(Microsoft.Maps.Map);
    }
);

document.body.appendChild(script);

控制台输出:

>>>  Microsoft
Object { Maps={...}}
>>>  Microsoft.Maps
Object { Globals={...}}
>>>  Microsoft.Maps.Map
undefined
4

2 回答 2

2

cbayram 是对的,你看得太早了。但具体来说,一旦他们完成加载(onscriptload),您就不会使用 Bing Map 特定的方式来触发您的脚本。我们避免使用全局函数,但 AFAIK 你真的需要在这里使用一个。

试试这个:

var script = new Element(
    'script', {
        type: 'text/javascript',
        src: 'http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&onscriptload=DrawMap'
    }
);

function DrawMap() {
   console.info(Microsoft);
   console.info(Microsoft.Maps);
   console.info(Microsoft.Maps.Map);
}

document.body.appendChild(script);

不重要,但为什么要将它附加到正文?我总是将它附加到头部。

于 2012-10-21T23:20:32.243 回答
0

BING Map API 的 JavaScript 文件会动态地将其他 JS 和 CSS 文件加载/注入到您的页面中。

<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/js/en-us/veapicore.js">
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/js/en-us/veapidelay.js">
<link rel="stylesheet" type="text/css" rev="stylesheet" href="http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/css/en/mapdelay.css">
<link rel="stylesheet" type="text/css" rev="stylesheet" href="http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/css/en/mapcontrol.css">
<script type="text/javascript" src="http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/js/en-us/veapiAnalytics.js"> 

Map 函数/对象似乎是在

http://ecn.dev.virtualearth.net/mapcontrol/v7.0/7.0.20121012100453.93/js/en-us/veapicore.js

编辑:

您的 script.observe 在加载第一个(初始)JS 文件时运行。Map 函数为时过早,因为它在 veapicore.js 中实例化,随后由初始 mapcontrol.ashx?v=7.0 加载。您在寻找该 Map 对象时还为时过早。

于 2012-10-19T23:50:16.977 回答