MSDNフォーラムから、Virtual Earth Dev SDKから最も単純な例をコピーして貼り付けても、IE8でのみ同じ例外がスローされます。ただし、http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx ?v = 6.3を使用した同じ例( ?v = 6が?v = 6.3に転送されたとしても、 ?v = 6の代わりに))エラーを修正します。
注:ここに示されているコードは、推奨事項に従った後の最近の試みを反映するように更新されています。このコードは、IE8でのみエラーが発生します。
http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=6を使用して地図を表示するページがあります。IE8では、JSエラーのみが発生し、マップは機能しません。マップは他のすべてのブラウザで美しく機能します。
例外がスローされ、キャッチされませんmapcontrol.ashx?v = 6&_ = 1303145735376、149行目文字618137 throw new VEException( "VEMap:cstr"、 "err_invalidelement"、L_invalidelement_text);
症状:
- 仮想地球ライブラリは問題なくロードされます。
- loadMapには構文エラーはありません。
- マップのdivプレースホルダーは、loadmap()が呼び出される前、呼び出されている間、および呼び出された後にページに存在します。
- このエラーは、loadmap()が呼び出された頃にのみスローされます。ライブラリがロードされたときではありません。
- マップは、IE8を除くすべてのブラウザーで問題なく表示されます。
- IE8のすべてのユーザーは、毎回エラーを受け取ります(私の知る限り、すべてのテスターはXPを使用していますが、1人はVistaを使用している可能性があります)。
- IE8では、エラーに関する通知がポップアップ表示されます。スクリプトデバッガー(上記)でさらに情報を取得できます。その後、IE8にマップは表示されません。
元々、すべてのJSはスクリプトタグでリンクされていました。それでもエラーは発生しました。いろいろな理由で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()の構文を変更しました。(最後の反復については上記を参照してください)
- フォーラムでの提案に基づいて、map.AddShapeLayer(propertyLayer)がpropertyLayer.AddShape(propertyPin)の前に実行されるようにピンコードを移動しました。IE8はまだエラーです。
- loadmap()関数内でグローバルに宣言されたすべての変数を移動しました。IE8はまだエラーです。
- SetClientTokenの直後(およびHideDashboardやその他すべての前)にVEMap.LoadMap()メソッドが呼び出されたことを確認しました。IE8はまだエラーです。
リンクの例--編集済み--。サンプルリンクはライブであるため、私が試みた修正は表示されないことに注意してください。ただし、試行された修正では問題が修正されていないため、それを無視して、まだ機能しない最新のコードについては、この投稿を参照してください。