【问题标题】:IE8-only JS error thrown by VE Maps v6, "Exception thrown and not caught"VE Maps v6 抛出的仅限 IE8 的 JS 错误,“抛出异常但未捕获”
【发布时间】:2011-04-19 00:06:03
【问题描述】:

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 中出错!

我有一个页面使用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 都是用 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 兼容(基于我找到的线程)。

最初我使用的是:

<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. 确保 VEMap.LoadMap() 方法在 SetClientToken 之后立即被调用(并且在 HideDashboard 和其他所有内容之前)。 IE8 仍然出错。

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

【问题讨论】:

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


    【解决方案1】:

    尝试两件事:

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

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

    【讨论】:

    • function loadmap() { var map = new VEMap('cmMap'), a = new Array(), propertyLayer = null, propertypoint = null, propertyPin = null, customicon = null, token=' ';变量标签 = "..."; map.SetClientToken(token); map.LoadMap(); map.HideDashboard(); // 等等 } var map = loadmap();
    【解决方案2】:

    来自MSDN forums将脚本调用更改为 ?v=6.3(代替 ?v=6)可修复错误。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多