2012-10-19 49 views
3

我正在动态加载Bing Map API脚本。当脚本完成加载时,我想构建我的地图。问题是MicrosoftMicrosoft.Maps被定义,但是Microsoft.Maps.Map不是。我意识到他们的脚本将异步加载更多脚本,但即使在等待10秒钟后添加这些额外的假设脚本,Microsoft.Maps.Map仍然未定义。那么如何加载Map课程?我没有看到他们的example,显式加载类。Bing地图在加载其javascript文件后未定义

使用Javascript(Prototype框架):

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 

回答

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); 

并不重要,但你为什么要追加到身体?我总是把它追加到头上。

+0

'onscriptload'参数修复了它。没有指定它们,它们将永远不会加载'Microsoft.Maps.Map'。我没有特别的理由给脚本添加脚本。我只是没有看到添加到身体或头部之间的任何区别。 – Pwner

+0

其实,一位在工作中的JavaScript大师建议将脚本附加到身体上。我想现在的方法是将它们粘在本体的末尾,这样你就不会减慢页面加载速度,所以如果你将它们动态地附加到某个地方,它应该成为其余部分所在的本体。 –

0

BING地图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对象时太早了。

+0

我检查了DOM,没有看到那些额外的JS和CSS加载。这种加载脚本的原型方式适用于Google Maps和MapBox。 – Pwner

+0

如果我在''中静态地包含脚本,则一切正常。但是,如果我动态地将脚本附加到“”或“”,它不起作用。我需要一种方式来动态加载它。 – Pwner

+0

你必须调试它。鉴于JavaScript源代码被混淆,这是棘手而痛苦的。看看你能否找到该脚本的开发版本。好的,请参阅答案上的编辑。 – cbayram