问题描述
|
在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抛出新
VEException(\“ VEMap:cstr \”,\“ err_invalidelement \”,L_invalidelement_text);
症状:
虚拟地球库的加载就很好了。
loadMap没有任何语法错误。
映射的div占位符在调用loadmap()之前,期间和之后存在于页面上。
仅在调用loadmap()时抛出该错误;库加载时不会。
该地图在IE8以外的所有浏览器中都能正常显示。
IE8的所有用户每次都会收到错误消息(据我所知,我的所有测试仪都在XP上,但可能在Vista上)。
在IE8中,会弹出一条有关该错误的通知,我可以在脚本调试器中获得更多信息(上述)。然后,没有地图出现在IE8中。
最初,所有JS都与脚本标签链接在一起。然后仍然发生错误。由于种种原因,我现在改用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()的语法。 (请参阅上面的最后一次迭代)
移动了密码,以便根据论坛上的建议在propertyLayer.AddShape(propertyPin)之前完成map.AddShapeLayer(propertyLayer)。 IE8仍然错误。
将所有全局声明的变量移到loadmap()函数中。 IE8仍然错误。
确保在SetClientToken之后(以及HideDashboard和其他所有内容之前)立即调用VEMap.LoadMap()方法。 IE8仍然错误。
示例链接-已编辑-。请注意,示例链接不会显示我尝试的修复程序,因为它是实时的。但是,由于尝试的修复无法解决问题,因此请忽略该问题,并参阅本文以获取仍然无法使用的最新代码。解决方法
尝试两件事:
首先,HideDashboard()方法(通常,VEMap对象上的所有方法)仅应在调用LoadMap()方法之后调用。不过,SetClientToken()可以。
其次,在var a = new Array();行中声明一个名为a的全局变量。
从内存来看,过去一直存在与Bing Maps API中声明的变量名称冲突的问题,而且我知道,经过混淆的Bing Maps库确实确实使用了单个字符的函数和参数名称:a,b,c,d等。如果这确实是全局变量,请尝试将其命名为更具描述性的名称,以避免覆盖现有变量的可能性。,在MSDN论坛上,将脚本调用更改为?v = 6.3(代替?v = 6)可修复该错误。
(即使据说将?v = 6转发到了?v = 6.3,并且两个脚本据称是相同的!)
升级到v7也是可行的,尽管必须升级loadmap()函数的语法。