Только для IE8 ошибка JS, выдаваемая VE Maps v6, "Исключение выброшено и не перехвачено"

На форумах 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 по разным причинам. Последний файл JS, загружаемый yepnope, связан с картами 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. Перемещен пин-код, так что map.AddShapeLayer(propertyLayer) был сделан до propertyLayer.AddShape(propertyPin) на основе предложения на форуме. IE8 по-прежнему ошибки.
    2. Перемещены все глобально объявленные переменные внутри функции loadmap(). IE8 по-прежнему ошибки.
    3. Гарантированный метод VEMap.LoadMap() был вызван сразу после SetClientToken (и до HideDashboard и всего остального). IE8 по-прежнему ошибки.

Пример ссылки --redacted--. Пожалуйста, обратите внимание, что ссылка на пример не будет показывать исправления, которые я пытаюсь исправить, потому что она работает Но так как попытка исправления не устранила проблему, пожалуйста, проигнорируйте это и обратитесь к этому сообщению для получения обновленного кода, который все еще не работает.

2 ответа

Решение

На форумах MSDN изменение вызова скрипта на? V =6.3 (вместо? V =6) исправляет ошибку.

(Даже если? V = 6 предположительно перенаправлен на? V = 6.3 и два сценария предположительно идентичны!)

Обновление до v7 также работает, хотя для обновления необходимы изменения в синтаксисе функции loadmap().

Две вещи, чтобы попробовать:

Во-первых, метод HideDashboard() (как и вообще все методы объекта VEMap) следует вызывать только после вызова метода LoadMap(). SetClientToken() хорошо, хотя раньше.

Во-вторых, вы объявляете глобальную переменную с именем a в строке var a = new Array(); По памяти в прошлом были проблемы с конфликтами имен с переменными, объявленными в API Bing Maps, и я знаю, что обфусцированная библиотека Bing Maps, безусловно, использует односимвольные функции и имена параметров: a,b,c,d и т. Д. Если это действительно должна быть глобальная переменная, попробуйте присвоить ей другое описательное имя, чтобы избежать возможности перезаписи существующей переменной.

Другие вопросы по тегам