Google maps api 3 如何在用户单击地图上的(业务)地点时获取单击事件

Google maps api 3 如何在用户单击地图上的(业务)地点时获取单击事件,google-maps-api-3,google-places-api,Google Maps Api 3,Google Places Api,我知道如何在地图上设置单击事件,当单击随机位置时效果很好。但是,当我点击一个商业场所时,谷歌地图会显示包含商业信息的气球,但不会将点击事件提升到我的JavaScript 您可以在这个地理编码演示中看到这种情况。浏览地图到某个城市,然后单击随机位置:地址显示在文本框“万岁”中!。现在找到一些商业场所并点击:地图弹出气球,但是没有点击事件被发送到JavaScript来更新文本框。讽刺的是:所需的地址信息可以在气球中找到 如何处理谷歌地图中商业场所的点击事件 截图: 编者按:这个答案在3.23版之前一

我知道如何在地图上设置单击事件,当单击随机位置时效果很好。但是,当我点击一个商业场所时,谷歌地图会显示包含商业信息的气球,但不会将点击事件提升到我的JavaScript

您可以在这个地理编码演示中看到这种情况。浏览地图到某个城市,然后单击随机位置:地址显示在文本框“万岁”中!。现在找到一些商业场所并点击:地图弹出气球,但是没有点击事件被发送到JavaScript来更新文本框。讽刺的是:所需的地址信息可以在气球中找到

如何处理谷歌地图中商业场所的点击事件

截图: 编者按:这个答案在3.23版之前一直适用。自2016年3.24版发布以来,您可以使用地图选项

基本上没有选项来处理POI上的点击

当然,您可以通过样式简单地隐藏这些要素,但如果您想让它们在地图上保持可见,这里有一个基于以下内容的解决方法:

当你点击一个POI时,一个信息窗口打开,你可以在那里获得访问权限

重写InfoWindow原型的setPosition方法,以便触发对地图的单击

//keep a reference to the original setPosition-function
var fx = google.maps.InfoWindow.prototype.setPosition;

//override the built-in setPosition-method
google.maps.InfoWindow.prototype.setPosition = function () {

  //logAsInternal isn't documented, but as it seems
  //it's only defined for InfoWindows opened on POI's
  if (this.logAsInternal) {
    google.maps.event.addListenerOnce(this, 'map_changed',function () {
      var map = this.getMap();
      //the infoWindow will be opened, usually after a click on a POI
      if (map) {
        //trigger the click
        google.maps.event.trigger(map, 'click', {latLng: this.getPosition()});
      }
    });
  }
  //call the original setPosition-method
  fx.apply(this, arguments);
};
演示:

这是在中跟踪的第4797版,最近已修复,并在3.26版中提供

从版本3.26开始,您应该侦听Map对象上的click事件。如果用户单击POI,则会引发a。此类扩展了常规MouseEvent并包含名为placeId的属性。因此,您可以检查事件对象是否定义了placeId。placeId字段当然包含一个placeId,您可以将其与PlaceAPI一起使用,以获取有关所单击图标的更多信息

我准备了一个小演示:


单击地图时,将触发ClickHandler对象的handleClick方法。您可以看到它检查placeId。然后,它使用placeId路由到该地点,最后使用Maps API中的Places服务获取有关该地点的信息(在本例中为名称、图标和地址)。

谢谢,此解决方法非常有效。上面使用的地理编码演示的唯一缺点是,POI位置的地理编码地址并不总是与气球中列出的POI的官方地址匹配。我将尝试通过Google Maps API Places库进行另一次往返,以获取此信息…从气球中获取详细信息请参阅Total love代码,您可以将其放置到位,并且它可以工作。我发现,如果您使用已登录的param@Ben_hawk:它似乎不受API版本的影响,对我来说,无论版本如何,它都可以在未登录的情况下工作。