0

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 throw new 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-Compatible(基于我找到的线程)。

最初我使用的是:

<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 代码,以便 map.AddShapeLayer(propertyLayer) 在 propertyLayer.AddShape(propertyPin) 之前完成。IE8 仍然报错。
    2. 在 loadmap() 函数中移动了所有全局声明的变量。IE8 仍然报错。
    3. 确保在 SetClientToken 之后(以及在 HideDashboard 和其他所有内容之前)立即调用 VEMap.LoadMap() 方法。IE8 仍然报错。

示例链接--redacted--。请注意,示例链接不会显示我尝试的修复,因为它是实时的。但是由于尝试的修复并没有解决问题,请忽略它并参考这篇文章以获取仍然不起作用的最新代码。

4

2 回答 2

1

有两件事要尝试:

首先,HideDashboard() 方法(通常是 VEMap 对象上的所有方法)只能在调用 LoadMap() 方法之后调用。SetClientToken() 之前还可以。

其次,您在var a = new Array(); 行中声明了一个名为a的全局变量 从记忆中,过去在 Bing Maps API 中声明的变量存在名称冲突的问题,而且我知道混淆的 Bing Maps 库确实使用单字符函数和参数名称:a、b、c、d 等。如果这确实必须是一个全局变量,请尝试将其命名为其他更具描述性的名称,以避免您覆盖现有变量的可能性。

于 2011-04-19T06:24:40.917 回答
0

MSDN 论坛中,将脚本调用更改为 ?v=6.3(代替 ?v=6)可修复错误。

即使?v=6 据称被转发到 ?v=6.3 并且这两个脚本应该是相同的!)

升级到 v7 也可以,但升级时需要更改 loadmap() 函数的语法。

于 2011-05-17T18:46:46.733 回答