Javascript 谷歌地图-使用多个标记时,信息窗口中会显示相同的文本

Javascript 谷歌地图-使用多个标记时,信息窗口中会显示相同的文本,javascript,google-maps,Javascript,Google Maps,我对谷歌地图上的多个标记有一个问题——我目前有一个存储信息(位置信息)的MySQL数据库。在php中,我提取这些信息并循环遍历每个邮政编码,以动态创建所需的javascript,为数据库中的每个位置放置一个标记 这是成功的,因此我知道我正在将正确的信息传递给js函数——现在我试图实现的是在单击标记时添加额外的信息,但在每个标记窗口上都显示相同的信息 这是我正在使用的js(我在顶部启动了一个图标,但现在已将其从代码中排除): 我的php代码是: $query = "SELECT * FROM ho

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

这是成功的,因此我知道我正在将正确的信息传递给js函数——现在我试图实现的是在单击标记时添加额外的信息,但在每个标记窗口上都显示相同的信息

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

我的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然后被回显


任何关于为什么会发生这种情况的建议都将不胜感激!谢谢

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

GLog参考

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

GLog.write ("placeMarkerAtPoint - " + html);
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);
        }
    });
}
在localSearch回调中:

GLog.write ("SearchCompleteCallback - " + text);
我认为这两个回调(特别是第二个回调)的日志记录将使html丢失的地方变得明显

更新:好的,根据您的日志记录,您的PHP代码很好。您正在生成三个对usePointFromPostcode的调用

这里的问题是您的google.search.SearchControl回调。我假设搜索工作正常,并且返回的结果数组适合每个相应的邮政编码


如果是这样,那么问题在于setSearchCompleteCallback中的文本参数。我没有使用这些东西,但问题在于这些回调是如何触发的。看起来你只需执行一次就可以得到它。

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

GLog参考

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

GLog.write ("placeMarkerAtPoint - " + html);
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);
        }
    });
}
在localSearch回调中:

GLog.write ("SearchCompleteCallback - " + text);
我认为这两个回调(特别是第二个回调)的日志记录将使html丢失的地方变得明显

更新:好的,根据您的日志记录,您的PHP代码很好。您正在生成三个对usePointFromPostcode的调用

这里的问题是您的google.search.SearchControl回调。我假设搜索工作正常,并且返回的结果数组适合每个相应的邮政编码


如果是这样,那么问题在于setSearchCompleteCallback中的文本参数。我没有使用这些东西,但问题在于这些回调是如何触发的。看起来您只需执行一次就可以获得。您使用的是名称标记,因此您放置的最后一个文本最终会附加到所有这些文本。创建一个索引并将其命名为marker1、marker2等。在php循环中很容易做到这一点。

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

您可能遇到了范围/闭包问题,类似于所讨论的问题

尝试替换此代码:

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

marker.bindInfoWindowHtml(html);

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

您可能遇到了范围/关闭问题,类似于所讨论的问题

尝试替换此代码:

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

marker.bindInfoWindowHtml(html);

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

正如您在评论中提到的,问题是您在收到任何结果之前发送了多个请求,并且每次发送请求时标记文本的值都会更改。我认为使用GClientGeocoder可以大大简化代码,除非绝对需要使用GLocalSearch,而GLocalSearch并不是mapsapi的一部分。这是给地理编码器的

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

var geocoder = new GClientGeocoder();
下面是新的usePointFromPostcode()函数:

GLog.write ("placeMarkerAtPoint - " + html);
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);
        }
    });
}
这对我很有效。试试看,让我们知道进展如何


如果需要有关返回点的更多信息,如精度,请使用而不是getLatLng()。本教程解释了它是如何工作的。

正如您在评论中提到的,问题是您在收到任何结果之前发送了多个请求,并且每次发送请求时标记文本的值都会更改。我认为使用GClientGeocoder可以大大简化代码,除非绝对需要使用GLocalSearch,而GLocalSearch并不是mapsapi的一部分。这是给地理编码器的

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

var geocoder = new GClientGeocoder();
下面是新的usePointFromPostcode()函数:

GLog.write ("placeMarkerAtPoint - " + html);
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);
        }
    });
}
这对我很有效。试试看,让我们知道进展如何


如果需要有关返回点的更多信息,如精度,请使用而不是getLatLng()。本教程解释了它的工作原理。

您是否有可能发布到该页面的链接?我同意@Cannonade的观点,谷歌地图代码似乎没有任何问题。你确定PHP代码输出了正确的内容吗?很遗憾,我无法发布代码的链接,因为我在一个内部服务器上托管它。谢谢你试着帮我。我也认为php输出有问题,但我只是通过将其输出到一个警报框来检查这一点&它每次都提供不同的文本,这就是为什么我认为我的Javascript有问题这是我正在使用的搜索