VE Maps v6引发的IE8-only JS错误,“异常抛出但未被捕获”

时间:2011-04-19 00:06:03

标签: javascript internet-explorer-8 bing-maps virtual-earth

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);

症状:

  • 虚拟地球库加载得很好。
  • loadMap没有任何语法错误。
  • 在调用loadmap()之前,期间和之后,页面上的div占位符存在于页面上。
  • 只有在调用loadmap()时才会抛出错误;不是在库加载时。
  • 地图显示在所有浏览器中都很好,但IE8。
  • IE8的所有用户每次都会收到错误(据我所知,我的所有测试人员都在使用XP,但可能是在Vista上)。
  • 在IE8中会弹出一个关于错误的通知,我可以在脚本调试器中获得更多信息(上图)。然后IE8中没有地图出现。

最初所有的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()的调整有所帮助 - 这并不奇怪,因为在其他页面上使用相同的函数没有问题。

就修复它而言,我尝试过:

  • 更改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()的语法。 (见上文最后一次迭代)

    1. 根据论坛上的建议移动了pin代码,以便在propertyLayer.AddShape(propertyPin)之前完成map.AddShapeLayer(propertyLayer)。 IE8仍然存在错误。
    2. 在loadmap()函数中移动了所有全局声明的变量。 IE8仍然存在错误。
    3. 确保在SetClientToken之后(以及在HideDashboard及其他所有内容之前)立即调用VEMap.LoadMap()方法。 IE8仍然存在错误。

示例链接 - 编辑 - 。请注意,示例链接不会显示我尝试的修复,因为它是实时的。但由于尝试的修复程序尚未解决问题,请忽略该问题并参考此帖子以获取仍然无法使用的最新代码。

2 个答案:

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