当用户点击地图上的(商业)地点时如何获取点击事件

Posted

技术标签:

【中文标题】当用户点击地图上的(商业)地点时如何获取点击事件【英文标题】:How to get a click event when a user clicks a (business) place on the map 【发布时间】:2014-08-05 17:05:48 【问题描述】:

我知道如何在地图上设置点击事件,并且在点击随机位置时效果很好。但是当我点击一个商业地点时,Google Maps 会显示包含该商业信息的气球,但是不会将点击事件引发到我的 javascript

您可以在此地理编码演示 (http://rjshade.com/projects/gmaps-autocomplete/) 中看到这种情况。浏览地图到某个城市并单击一个随机位置:地址显示在文本框中(万岁!)。现在找到一些营业地点并单击它:地图弹出气球,但没有向 JavaScript 发送单击事件来更新文本框。具有讽刺意味的是:所需的地址信息在气球中可用!

如何处理谷歌地图中商户的点击事件?

截图:

【问题讨论】:

【参考方案1】:

编者注:此答案适用于 3.23 版。自 2016 年发布 3.24 版本以来,您可以使用 clickableIcons 映射选项。 See this answer.


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

当然,您可以通过样式简单地隐藏这些功能,但是当您想让它们在地图上可见时,这里有一个解决方法(基于:click event listener on styled map icons and labels):

当您单击 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);
;

演示:http://jsfiddle.net/doktormolle/aSz2r/

【讨论】:

谢谢,这个解决方法效果很好。在上面使用的地理编码演示的上下文中,唯一的缺点是 POI 位置的地理编码地址并不总是与气球中列出的 POI 的官方地址相匹配。我将尝试通过 Google Maps API Places Library 进行另一次往返以获取此信息... 要从气球中获取详细信息(地址),请参阅***.com/questions/21486868/… 爱上代码,你可以把它放在适当的位置,它就可以工作 如果您使用 signed_in 参数,我发现这在 3.20 版中不再有效 @Ben_hawk:它似乎不受 API 版本的影响,对我来说它可以工作(没有signed_in),无论版本如何。【参考方案2】:

这是在 Google Maps API issue tracker 中跟踪的问题 #4797,最近已修复,在 3.26 版中可用。

从 3.26 版开始,您应该在 Map 对象上监听“click”事件。如果用户单击 POI,则会引发 IconMouseEvent。该类扩展了Regular MouseEvent 并包含一个名为placeId 的属性。因此您可以检查事件对象是否已定义 placeId。 placeId 字段当然包含一个 Place Id,您可以将其与 Places API 一起使用以获取有关被点击图标的更多信息。

我准备了一个小演示:http://jsbin.com/parapex/10/edit?html,output

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

【讨论】:

以上是关于当用户点击地图上的(商业)地点时如何获取点击事件的主要内容,如果未能解决你的问题,请参考以下文章

百度地图开发中怎么实现点击地图中的字或建筑获取到位置,如图

怎么移除地图监听事件

Facebook:当用户点击粉丝页面上的“喜欢”按钮时获取

如何从地图上获取街道地址、邮政编码、国家、州?

高德地图怎样实现实时定位,得到当前地点的坐标,位置

百度地图怎么报错