从MSDN 论坛中,即使是从 Virtual Earth Dev SDK 复制和粘贴最简单的示例,也会导致仅在 IE8 中引发相同的异常。但是,使用http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6.3的相同示例(代替 ?v=6,即使据称将 ?v=6 转发到 ?v=6.3 ) 修复错误。
注意:此处显示的代码已更新以反映我在遵循建议后最近的尝试——此代码仅在 IE8 中仍然出错!
我有一个页面使用http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6来显示地图。在IE8 中只有一个 JS 错误并且地图不起作用。该地图在所有其他浏览器中运行良好。
抛出异常但未捕获 mapcontrol.ashx?v=6&_=1303145735376,第 149 行字符 618137 throw new VEException("VEMap:cstr","err_invalidelement",L_invalidelement_text);
症状:
- 虚拟地球库加载得很好。
- loadMap 没有任何语法错误。
- 在调用 loadmap() 之前、期间和之后,地图的 div 占位符存在于页面上。
- 仅在调用 loadmap() 时才抛出错误;不是在库加载时。
- 该地图在除 IE8 之外的所有浏览器中都显示得很好。
- IE8 的所有用户每次都会收到错误消息(据我所知,我所有的测试人员都在 XP 上,但可能有一个在 Vista 上)。
- 在 IE8 中会弹出一个关于错误的通知,我可以在脚本调试器中获得更多信息(上图)。然后在 IE8 中没有地图出现。
最初所有的 JS 都是用 script 标签链接的。那时错误仍然发生。由于各种原因,我现在切换到 yepnope。yepnope 加载的最后一个 JS 文件是与地图相关的 jquery.vemap.js:
(function($){
$.fn.showMap = function(){
var jqoThis = this;
jqoThis.oneTime(1000, "loadVELibrary", function(){
$.getScript("http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6", function(){
jqoThis.oneTime(1000, "loadMap", function(){
if(typeof(loadmap) == 'function'){ var map = loadmap(); }
$(this).oneTime(500, "setZoom", function(){
if(typeof(map) == 'object'){ if(typeof(map.SetZoomLevel) == 'function'){ map.SetZoomLevel(13); } }
}); // oneTime "setZoom"
}); // oneTime "loadMap"
}); // $.getScript
}); // oneTime "loadVELibrary"
}; // showMap
})(jQuery);
基本上,这几乎只存在调用 loadmap(),这是一个与我们的后端代码合作编写的函数。后端代码将其作为嵌入脚本输出到 HTML 中。loadmap() 看起来像:
function loadmap()
{
var map = new VEMap('cmMap'),
arp = [],
propertyLayer = null,
propertypoint = null,
propertyPin = null,
customicon = null,
token = '...',
label = "...";
map.SetClientToken(token);
map.LoadMap();
map.HideDashboard();
propertyLayer = new VEShapeLayer();
map.AddShapeLayer(propertyLayer);
propertypoint = new VELatLong(parseFloat(33.12966),parseFloat(-117.333488));
arp[0] = propertypoint;
propertyPin = new VEShape(VEShapeType.Pushpin,propertypoint);
customicon = new VECustomIconSpecification();
customicon.Image = "....";
propertyPin.SetCustomIcon(customicon);
propertyPin.SetDescription(label);
propertyLayer.AddShape(propertyPin);
map.SetCenterAndZoom(propertypoint,13);
return map;
}
对 loadmap() 的所有更改仅在我的本地开发机器上进行和测试。到目前为止,对 loadmap() 的任何调整都没有帮助——这并不奇怪,因为在其他页面上使用相同的函数没有问题。
至于修复它,我已经尝试过:
- 更改 X-UA-Compatible(基于我找到的线程)。
最初我使用的是:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
我尝试将其更改为以下内容,因为一些线程提到解决了该问题。
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
我还尝试完全移除 X-UA-Compatible。这些都没有解决问题,我继续在 IE8 中遇到错误。手动切换兼容模式也没有效果。
更改了 loadmap() 的语法。(最后一次迭代见上文)
- 根据论坛上的建议,移动了 pin 代码,以便 map.AddShapeLayer(propertyLayer) 在 propertyLayer.AddShape(propertyPin) 之前完成。IE8 仍然报错。
- 在 loadmap() 函数中移动了所有全局声明的变量。IE8 仍然报错。
- 确保在 SetClientToken 之后(以及在 HideDashboard 和其他所有内容之前)立即调用 VEMap.LoadMap() 方法。IE8 仍然报错。
示例链接--redacted--。请注意,示例链接不会显示我尝试的修复,因为它是实时的。但是由于尝试的修复并没有解决问题,请忽略它并参考这篇文章以获取仍然不起作用的最新代码。