Только для IE8 ошибка JS, выдаваемая VE Maps v6, «Исключение выброшено и не обнаружено» - PullRequest
0 голосов
/ 19 апреля 2011

На форумах 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: ПРМ", "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-совместимого (в зависимости от найденных тем).

Первоначально я использовал:

<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 по-прежнему ошибки.

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

Ответы [ 2 ]

1 голос
/ 19 апреля 2011

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

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

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

0 голосов
/ 17 мая 2011

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

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

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

...