【发布时间】:2011-04-19 00:06:03
【问题描述】:
从MSDN forums 开始,即使从 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 抛出新的 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 兼容(基于我找到的线程)。
最初我使用的是:
<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 仍然出错。
- 确保 VEMap.LoadMap() 方法在 SetClientToken 之后立即被调用(并且在 HideDashboard 和其他所有内容之前)。 IE8 仍然出错。
示例链接 --redacted--。请注意,示例链接不会显示我尝试的修复,因为它是实时的。但是由于尝试的修复并没有解决问题,请忽略它并参考这篇文章以获取仍然不起作用的最新代码。
【问题讨论】:
标签: javascript internet-explorer-8 bing-maps virtual-earth