【问题标题】:Google Marker Drop Animation with Timeout带有超时的 Google 标记放置动画
【发布时间】:2014-03-28 02:01:39
【问题描述】:

我正在尝试为大量 Google 标记创建 DROP 动画。 我不希望 300 个(左右)标记同时掉落,所以我进行了一些搜索并找到了“setTimeout”功能。

我一直按照这个问题的说明进行操作:

Animation of google markers on map load with timeout

我按照与上面帖子中相同的步骤进行操作,但似乎无法让代码在我的示例中运行。

这是我认为可行的方法......

var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 6,
  center: new google.maps.LatLng(54.059170, -4.797820),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});


var infowindow = new google.maps.InfoWindow();

var marker, i;

for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
    animation: google.maps.Animation.DROP,
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    icon: EuroPCmarker,
  });


  (function (i, marker) {


  google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
      infowindow.setContent(locations[i][0]);
      infowindow.open(map, marker);
    });

  })(marker, i);
  if(i++ < nc.length) {
        setTimeout(function() {addmarker(i)}, 100);
    }

}
addmarker(0);

我的代码与我提到的链接中的帖子略有不同,但我不明白为什么无论如何它都不应该工作。

这是我的工作代码(一次性删除所有标记)...

  var map = new google.maps.Map(document.getElementById('map'), {
  zoom: 6,
  center: new google.maps.LatLng(54.059170, -4.797820),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});


var infowindow = new google.maps.InfoWindow();

var marker, i;

for (i = 0; i < locations.length; i++) {  
  marker = new google.maps.Marker({
        animation: google.maps.Animation.DROP,
    position: new google.maps.LatLng(locations[i][1], locations[i][2]),
    map: map,
    icon: EuroPCmarker,
  });


  google.maps.event.addListener(marker, 'click', (function(marker, i) {
    return function() {
      infowindow.setContent(locations[i][0]);
      infowindow.open(map, marker);
    }
  })(marker, i));
}

JavaScript 可能非常无情,很难排除故障,因为如果你犯了一个错误,地图就无法一起显示,我真的很茫然。

知道我做错了什么吗?

#firstpost :)

【问题讨论】:

  • 你能贴出设置location的代码吗?我已经为这个问题启动了JSFiddle
  • 嗨 LaughDonor,抱歉回复晚了。我已经用我的代码稍微编辑的版本更新了您创建的 JSFiddle(删除了公司名称、徽标、销售数据等)
  • 您没有在 Fiddle 中将 HTML 与 Javascript 和 CSS 分开,并且在位置列表中有一个尾随逗号。

标签: javascript jquery google-maps google-maps-api-3


【解决方案1】:

此答案基于标记连续下降并带有 'rainfall' 效果。

根据您更新的comment,我更新了最后一个JSFiddle,以反映您对问题的明确性。

我基本上交换了for 循环和setTimeout 行并将iterator 用作全局变量。

iterator = 0; //Setup global iterator to go through markers
for(var i = 0; i < locations.length; i++)
    setTimeout( function() {
        //i can't be passed through because, by the time setTimeout executes, i == locations.length
        addMarker(locations);
    }, i * 500); //Execute addMarker every 500ms 

很抱歉有任何混淆,这一切都记录在Google Marker Animation Demo 下。

【讨论】:

  • 这两个答案都会派上用场,但尤其是这个答案正是我想要的。非常感谢 LaughDonor! :) 感谢您对此的耐心。
【解决方案2】:

此答案基于 OP 的原始问题,即在设定时间后同时删除所有标记

我已经用修复更新了JSFiddle。就像Google Marker Animation Demo 一样,您只需为将标记实例化到地图的部分添加一个设置超时。

我将关键部分封装在一个匿名函数中,并在 DOM 和 Google Maps API 准备就绪后 1 秒调用,最后使用 google.maps.event.addDomListener(window, 'load', initialize );

【讨论】:

  • 我仍然无法让它打球JSFiddle。我按照 Google Marker Animation Demo 的格式分离了 setTimeout 和标记实例。添加 setTimeout 是我不明白的一点(例如,我不知道如何操作代码以使用我已经在使用的代码)
  • 你搞砸了 JSFiddle 中的大括号。他们的演示使setTimeout 函数内部的东西过于复杂。 LocationiaddMarker 函数内没有作用域,当您将这部分代码拉到 initialize 之外时。在addListener 回调函数中包装一个闭包是不必要的。 Google 的 Demo 执行不同的功能,即按顺序放置标记。你在 OP 中说你希望它们同时被丢弃,所以我把它改回来了。我也修复了引用,因为该代码存在很多问题。
  • 我认为主要问题是代码中缺少 cmets。对此我深表歉意,我希望我已经添加了足够的数量,以便您可以了解这次发生的事情。我已经更新了JSFiddle
  • 抱歉,我的问题肯定表述得很糟糕,我能够一次删除所有标记,但是,我想要标记快速连续删除一个接一个(很像这篇文章中的:Animation of google markers on map load with timeout。这就是为什么我在这里稍微更改了JSFiddle以模拟quote:'雨效果”。很抱歉造成混乱。
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2013-01-29
相关资源
最近更新 更多