Google地图 - 使用多个标记时,信息窗口中会显示相同的文字

时间:2009-07-01 15:20:48

标签: javascript google-maps

我在谷歌地图上遇到多个标记问题 - 我目前有一个存储信息的MySQL数据库(位置信息)。在php中,我然后提取此信息并循环遍历每个邮政编码,以动态创建所需的javascript,为我的数据库中的每个地方放置一个标记。

这样做成功,所以我知道我正在将正确的信息传递给js函数 - 现在我想要实现的是在点击标记时添加附加信息,但它在每个标记窗口显示相同的信息。 / p>

这是我正在使用的js(我在顶部启动了一个图标,但现在将其排除在代码之外):

function usePointFromPostcode(postcode, callbackFunction, text) {

    localSearch.setSearchCompleteCallback(null, 
        function() {

            if (localSearch.results[0])
            {       
                var resultLat = localSearch.results[0].lat;
                var resultLng = localSearch.results[0].lng;
                var point = new GLatLng(resultLat,resultLng);
                callbackFunction(point, text);
            }else{
                alert("Postcode not found!");
            }
        }); 

    localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPoint(point, html, icon)
{
    var marker = new GMarker(point,{icon: icon});

    GEvent.addListener(marker,"click",function() {
        marker.openInfoWindowHtml(html);
    });

    map.addOverlay(marker);
}

我的PHP代码是:

$query = "SELECT * FROM hospitalInfo";
$result = mysql_query($query);

if($result) {
    while ($row = mysql_fetch_assoc($result)) {
        $code .= "usePointFromPostcode('".$row['Postcode']."', placeMarkerAtPoint, 
        '".$row['placeName']."');";

    }
}

$ code然后回显。

对于为什么会发生这种情况的任何建议都将非常感谢!谢谢!

4 个答案:

答案 0 :(得分:2)

您可能遇到范围/结束问题,类似于所讨论的问题here

尝试替换此代码:

GEvent.addListener(marker,"click",function() {
    marker.openInfoWindowHtml(html);
});

用这个:

marker.bindInfoWindowHtml(html);

如果这不起作用,我猜测闭包问题来自setSearchCompleteCallback()函数。没有看到实际的页面就很难猜到。

答案 1 :(得分:1)

我认为您的Google地图代码没有问题。我建议你尝试将placeMarkerAtPoint和文本参数中的html参数记录到localSearch回调中。谷歌有一个非常有用的日志API,你可以使用:

GLog参考

我会在placeMarkerAtPoint函数的开头添加:

GLog.write ("placeMarkerAtPoint - " + html);

并在localSearch回调中:

GLog.write ("SearchCompleteCallback - " + text);

我认为这两个回调(尤其是第二个回调)的日志记录将使html丢失的地方显而易见。

更新:好的,基于您的日志记录,您的PHP代码很好。您正在生成三个使用PointFromPostcode的调用。

这里的问题是你的google.search.SearchControl回调。我假设搜索工作正常,你得到的结果数组适用于每个相应的邮政编码?

如果是这样,那么问题在于setSearchCompleteCallback中的text参数。我没有使用Google AJAX Search的东西,但问题在于如何触发这些回调。看起来你可以获得multiple callbacks一次执行。

答案 2 :(得分:1)

正如您在评论中提到的,问题是您在获得任何结果之前发送了多个请求,并且每次发送请求时标记文本的值都会更改。我认为你可以通过使用GClientGeocoder大大简化你的代码 - 除非绝对有必要使用GLocalSearch,它不是Maps API的一部分。这是地理编码器的Google's tutorial

首先像这样创建地理编码器:

var geocoder = new GClientGeocoder();

接下来,这是您的新 usePointFromPostcode()功能:

function usePointFromPostcode(postcode, text) {
    geocoder.getLatLng(postcode, function(point) {
        if (!point) {
            //alert('address not found');
        } else {
            var marker = new GMarker(point, {icon: icon});
            GEvent.addListener(marker, "click", function() {
                marker.openInfoWindowHtml(text);
            });
            map.addOverlay(marker);
        }
    });
}

这对我很有用。尝试一下,让我们知道它是怎么回事。

如果您需要有关返回点的更多信息,例如准确性,请使用getLocations()而不是getLatLng()。该教程解释了它的工作原理。

答案 3 :(得分:0)

您正在重复使用名称标记,因此您放置的最后一个文本最终会附加到所有文本。创建一个索引,并将它们命名为marker1,marker2等。在php循环中很容易做到。