VE Maps v6抛出仅IE8的JS错误,“抛出并没有捕获到异常”

| 在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()函数的语法。

要回复问题请先登录注册