所有Google Maps v3标记的公共事件处理程序

时间:2014-11-01 12:04:25

标签: javascript google-maps google-maps-api-3 google-maps-markers marker

我有一个显示500个标记的地图,当用户滚动地图时会重绘它们。每个标记都非常复杂 - 它们被编号并且附加了点击,鼠标悬停和鼠标移除(以使它们动画化)事件。这会导致一些性能问题,因为删除和添加这些标记需要花费大量时间。我一直想知道是否可以为整个地图附加单击,鼠标悬停和鼠标移动事件处理程序,并捕获从那里的标记起泡的事件。这可能吗?它会改善表现吗?

我发现了这个 - How do I make a single event handler for all markers in Google Maps V3? - 它更好,但它仍然需要将处理程序分别附加到每个标记。

我还发现了Google地图数据图层 - https://developers.google.com/maps/documentation/javascript/datalayer#add_event_handlers - 看起来整个图层只附加了一个事件,但我不确定它是否不会将其附加到每个标记内部无论如何。我也不确定额外的抽象级别是否会降低速度。

还有其他解决方案吗?

4 个答案:

答案 0 :(得分:0)

我遇到了这个问题并通过制作群集找到了解决方案:http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/docs/examples.html

这有很大帮助,实际上比将所有内容放入数组并将它们逐个推送到地图更快

您可以保留每个标记的事件并将它们分组+使其成为聚类。

答案 1 :(得分:0)

几年前我实施了一个房地产搜索引擎。想想一个覆盖着数百,数千,数万个标记的股票谷歌地图。

我们发现谷歌地图上方的平铺覆盖是性能最佳的解决方案。地图API支持叠加,可用于代替标记,以最小的延迟在地图上显示对象。它们可以很好地替代用例,否则需要大量的标记。

使用mapserver等工具可以非常轻松地生成切片。与tile一起使用时,您还需要编写一个自定义单击处理程序,并且可能需要一个Web服务,它将坐标解析为单个标记并返回该标记的数据。

答案 2 :(得分:0)

我做了一些测试,发现使用loadGeoJson类的google.maps.Data方法实际上比使用标准的jQuery AJAX调用更慢。

我使用JSON测试了大约7000个条目,为每个条目创建/绘制标记并在每个标记上绑定点击事件。

以下是Chrome中脚本编写时间的结果(平均10个请求):

  • 使用loadGeoJson:
  

平均值:3.156s |高:3.69s |低:2.75秒

  • 标准AJAX请求
  

平均值:1.795秒 |高:2.01s |低:1.66秒

现在如果加载500个标记真的很慢,您可能希望公开您的代码,以便我们知道您是如何做到的。也许在加载/重新加载/删除标记的方式上可以改进一些东西?

希望这有帮助!

答案 3 :(得分:0)

我们通过在标记上启用“优化”标记来解决所有问题。然后标记在地图画布上呈现,它们在DOM中不可见,这也意味着没有直接附加到它们的事件处理程序。我们通过在标记悬停时动态创建div元素来实现交互性。现在一切都比较顺畅了。