从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中出现STILL错误!
我有一个使用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);
症状:
最初所有的JS都与脚本标签相关联。然后错误仍然发生。我现在因各种原因切换到yepnope。 yepnope加载的最后一个JS文件是一个与map相关的文件,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()的调整有所帮助 - 这并不奇怪,因为在其他页面上使用相同的函数没有问题。
就修复它而言,我尝试过:
最初我在使用:
<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()的语法。 (见上文最后一次迭代)
示例链接 - 编辑 - 。请注意,示例链接不会显示我尝试的修复,因为它是实时的。但由于尝试的修复程序尚未解决问题,请忽略该问题并参考此帖子以获取仍然无法使用的最新代码。
答案 0 :(得分:1)
要尝试两件事:
首先,只有在调用LoadMap()方法后才能调用HideDashboard()方法(通常是VEMap对象上的所有方法)。尽管如此,SetClientToken()还是可以的。
其次,你在行var a = new Array()中声明一个名为 a 的全局变量; 从内存来看,过去存在一些问题,名称与Bing Maps API中声明的变量冲突,我知道混淆的Bing Maps库肯定使用单字符函数和参数名称:a,b,c,d等。如果这真的必须是一个全局变量,那么尝试将其命名为更具描述性的其他内容,以避免您覆盖现有变量的可能性。
答案 1 :(得分:0)
从MSDN forums,将脚本调用更改为?v = 6.3(代替?v = 6)可修复错误。
( 即使 ?v = 6据称转发到?v = 6.3且两个脚本相同!)
升级到v7也有效,但升级需要更改loadmap()函数的语法。