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

一件非常错误的事情是 for/in 循环用于对象而不是数组。我一直讨厌 IE,但现在越来越多的时候,当我希望其他人都这样做时,它似乎会被打破。它可能会打破这一点。在这些花哨的新 JIT 年轻的 Whippersnapper 浏览器中往往会发生的事情是,它们会击中所有的键,而且还会击中所有的数组属性,这很愚蠢,IMO。这是一种轻量级且更有效的遍历数组的方法(请记住它是倒退的):

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 回答