0

以下のコードはFirefoxとIE9で正常に機能しますが、IE8でマーカーを更新する際に問題が発生します。「SCRIPT16389:指定されていないエラー。main.js、20行目の文字313」が表示され、作成されたマーカーが新しいデータセットで更新されません。

私のnewdata.json形式は

 {
    "points": [
        {
            "lat": "-28.0000",
            "long": "133.1500",
            "id": 0
        },
        {
            "lat": "-28.4710",
            "long": "153.3443",
            "id": 1
        }
    ]
}

以下は、jsonを取得し、クラスタリングを使用してポイントを表示するためのスクリプトです。

var map=null;
var markersArray = [];
var markerCluster= null;
google.load('maps', '3', {
        other_params: 'sensor=true'
});
google.setOnLoadCallback(initialize);

function initialize() {
    var mapcentre = new google.maps.LatLng(-29,135);
    var mapOptions = {
        zoom: 5,
        center: mapcentre,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById('map'), mapOptions);
    startTimer();
}

function startTimer(){
    setInterval(function() {
        deleteOverlays();//should delete any existing point and clear the cluster
        addMarker();
    },3000);
}

function addMarker() {
        $.ajax({
            type: "GET",
            url: "newdata.json",
            async: false,
            dataType: "json",
            success: function(data){
                for (var i = 0, dataPoint; dataPoint = data.points[i]; i++) {
                    var latLng = new google.maps.LatLng(dataPoint.lat,dataPoint.long);
                    var marker = new google.maps.Marker({
                            position: latLng
                    });
                    markersArray.push(marker);
                }           

                markerCluster = new MarkerClusterer(map, markersArray);
            } 


        });
}


// Deletes all markers in the array by removing references to them
function deleteOverlays() {
  if (markersArray.length > 0) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
  if(markerCluster!= null) {
       markerCluster.clearMarkers();
  }
}

IE8では、マップは正常に読み込まれ、最初のデータは正常に表示されますが、新しいデータは更新されないため、deleteOverlaysに問題があると思いますか?

上記の例は、http: //google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/examples/advanced_example.html?compiledに基づいています。

4

2 に答える 2

0

非常に間違っていることの 1 つは、for/in ループが配列ではなくオブジェクトを対象としているということです。私はいつも IE が大嫌いでしたが、最近では、他の人にそうしてもらいたいと思ったときに壊れてしまうことがますます多くなっているようです。それはそれで壊れているかもしれません。これらの派手な新しい JIT の若いウィッパースナッパー ブラウザーで起こりがちなことは、すべてのキーだけでなく、ばかげたすべての配列プロパティもヒットすることです。これはタイピングが簡単で、配列をループするはるかに効率的な方法です (逆方向になることに注意してください)。

var i = markersArray.length
while(i--){
    markersArray[i].setMap(null);
}

そうでない場合は、HTML を確認してください。HTML を壊してしまった場合、他のブラウザーはそれをつなぎ合わせる方法を理解するのに十分賢いかもしれません (これも賢い IMO です) 一方で、IE8 はマンハッタン プロジェクトのグラウンド ゼロでカナリアのようにバケツを蹴ります。

いいえ、本当に、配列で for/in を使用するのをやめてください。機能していても、完全に混乱する可能性があります。

于 2012-07-18T02:38:59.970 に答える
0

cache:false を追加すると、IE8 が常に最新の json を取得し、意図したとおりにマーカーを更新するようになりました。

 function addMarker() {
    $.ajax({
        type: "GET",
        url: "newdata.json",
        async: false,
        cache: false,
        dataType: "json",
        success: function(data){
            for (var i = 0, dataPoint; dataPoint = data.points[i]; i++) {
                var latLng = new google.maps.LatLng(dataPoint.lat,dataPoint.long);
                var marker = new google.maps.Marker({
                        position: latLng
                });
                markersArray.push(marker);
            }           

            markerCluster = new MarkerClusterer(map, markersArray);
        } 


    });

}

于 2012-07-19T04:19:03.943 に答える