Только для 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(). (См. Выше для последней итерации)
- Перемещен пин-код, так что map.AddShapeLayer(propertyLayer) был сделан до propertyLayer.AddShape(propertyPin) на основе предложения на форуме. IE8 по-прежнему ошибки.
- Перемещены все глобально объявленные переменные внутри функции loadmap(). IE8 по-прежнему ошибки.
- Гарантированный метод 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 и т. Д. Если это действительно должна быть глобальная переменная, попробуйте присвоить ей другое описательное имя, чтобы избежать возможности перезаписи существующей переменной.