На форумах 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. Переключение режима совместимости вручную также не имело никакого эффекта.
Пример ссылки - отредактировано - . Обратите внимание, что ссылка на пример не покажет исправления, которые я пытаюсь выполнить, потому что она работает. Но так как попытка исправления не устранила проблему, пожалуйста, проигнорируйте это и обратитесь к этому сообщению для получения обновленного кода, который все еще не работает.