Google Maps Utility Library v3 - 信息框未关闭

时间:2012-06-04 05:15:26

标签: google-maps google-maps-api-3

我正在使用Google Maps Utility Library V3中的Infobox,我在一次性删除所有信息框时遇到了一些麻烦,但没有跟踪所有信息框或添加事件监听。

我目前正在使用以下代码。

function initMarkers(map, markerData) {


    for(var i=0; i<markerData.length; i++) {

    var iconimage = "markers/" + trackall + ".png";
    marker = new google.maps.Marker({
            map: map,
            draggable: false,
            position: markerData[i].latLng,
            visible: true,
            icon: iconimage
        }),
        boxText = document.createElement("div"),
        //these are the options for all infoboxes
        infoboxOptions = {

         content: boxText
        ,disableAutoPan: true
        ,maxWidth: 0
        ,pixelOffset: new google.maps.Size(20, -75)
        ,zIndex: null
        ,boxStyle: {
          background: "url('') no-repeat"
          ,opacity: 0.75
          ,width: "140px"
         }
        ,closeBoxMargin: "10px 2px 2px 2px"
        ,closeBoxURL: ""
        ,infoBoxClearance: new google.maps.Size(1, 1)
        ,isHidden: false
        ,pane: "floatPane"
        ,enableEventPropagation: false
    };

        newMarkers.push(marker);
        //define the text and style for all infoboxes
        boxText.style.cssText = "border: 1px solid black; margin-top: 5px; background: #E0E7EF; padding: 5px;";
        boxText.innerHTML = markerData[i].address + "<br>" + markerData[i].state;
        //Define the infobox

        newMarkers[i].infobox = new InfoBox(infoboxOptions);
        //Open box when page is loaded

        newMarkers[i].infobox.open(map, marker);

        //Add event listen, so infobox for marker is opened when user clicks on it.  Notice the return inside the anonymous function - this creates
        //a closure, thereby saving the state of the loop variable i for the new marker.  If we did not return the value from the inner function,
        //the variable i in the anonymous function would always refer to the last i used, i.e., the last infobox. This pattern (or something that
        //serves the same purpose) is often needed when setting function callbacks inside a for-loop.
        google.maps.event.addListener(marker, 'click', (function(marker, i) {
            return function() {
                //newMarkers[i].infobox.open(map, this);
                //map.panTo(markerData[i].latLng);
                //newMarkers[i].infobox.close();
            /}
        })(marker, i));
    }

    return newMarkers;

}

//here the call to initMarkers() is made with the necessary data for each marker.  All markers are then returned as an array into the markers variable
markers = initMarkers(map, [
    { latLng: pointall}

]);

在上面的例子中,我使用的是变量pointall,它包含不断变化的标记信息。该站点是一个航班跟踪站点,因此它可以不断跟踪不同位置的任意数量的飞机。每次都有更新,例如。要绘制的新标记,我使用以下函数首先删除旧标记。

function clearOverlays() {
  if (newMarkers) {
    for (var i = 0; i < newMarkers.length; i++ ) {
    newMarkers[i].setMap(null);
    }
  }
}

以上删除了所有标记但是如果我添加

newMarkers[i].infobox.close();

删除第一个标记但停止执行代码。

有没有一种简单的说法..关闭所有打开的信息框。我不需要知道哪一个都需要关闭。目前,使用新标记打开信息框,但旧的信息框保持不变。

注意:我没有使用javascript,所以对我来说很容易;)

任何帮助都将不胜感激。

由于

编辑:我这里运气不错。正如所建议的,我已经尝试创建一个数组来保存信息框,但我必须做错事。

我尝试添加以下声明:

ibArray = [];

我接着尝试添加:

ibArray.push(marker); 

我已经在几个位置添加了上面的内容,包括在将标记推入newMarkers数组后立即添加,但无论我在何处放置代码它都会破坏我的其余代码而不显示任何信息框。

我怀疑我的语法不正确,而且我也无法找到放置代码的位置。

其他人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

你应该对标记做同样的事情,即跟踪infoWindows并循环遍历数组,关闭它们(并从数组中删除它们)。