【问题标题】:Mouse scroll not working on appended div on Google map鼠标滚动不适用于谷歌地图上的附加 div
【发布时间】:2019-09-22 16:32:31
【问题描述】:

我在谷歌地图中心添加了一个固定标记:

div 的 CSS:

.centerMarker{
   width:30px;
   height:60px;
   margin:auto;
   position:absolute;
   top:50%;
   left:50%;
   z-index:2;
   background:url('fixedMarker.png') no-repeat center;
   background-size:30px 60px;
   margin-top:-60px;
   margin-left:-15px;
}

将 div 添加到地图的脚本:

$('<div/>').addClass('centerMarker').appendTo(map.getDiv())

这会导致滚动(用于缩放)在附加的 div 上不起作用(但在地图的其他部分起作用)。如何让滚动事件通过 div 并到达地图?

编辑:我需要这个 div 是可点击的。所以我不应该禁用这个 div 上的所有事件。

【问题讨论】:

  • 你为什么不添加一个谷歌地图Marker
  • 所以我必须在拖动时使用getCenter,它会导致固定标记中的滞后和跳跃(我认为这是因为对拖动事件的连续计算)。 @MrUpsidown

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


【解决方案1】:

由于 Google 地图 iframe 仅在按下 ctrl 时才有效,因此您可以使用 JQuery 事件在按下 ctrl 时使 centerMarker 事件不敏感,如下所示:

$("window").keydown((e) => {
  if (e.keyCode == 17) {
    $(".centerMarker").css("pointer-events", "none");
  }
});

$("window").keyup((e) => {
  if (e.keyCode == 17) {
    $(".centerMarker").css("pointer-events", "all");
  }
});
#parent {
  position: relative;
}

.centerMarker {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  background: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="parent"><iframe width="700" height="440" src="https://maps.google.com/maps?width=700&amp;height=440&amp;hl=en&amp;q=Paris%2C%20France+(Titre)&amp;ie=UTF8&amp;t=&amp;z=10&amp;iwloc=B&amp;output=embed" frameborder="0" scrolling="no" marginheight="0" marginwidth="0"></iframe>
  <div class="centerMarker">
    test
  </div>
</div><br />
现在的问题是,当您单击 iframe 时,您会专注于它并且 keydown 事件不再触发,您必须在它之外单击以使其再次工作。

【讨论】:

  • 感谢您提供详细信息,但我使用 gestureHandling: 'greedy',因此解决方案不依赖于 CTRL 键处理。
【解决方案2】:

我真的不明白你为什么需要它,而且你还没有提供完整的代码和用例。

可以做的是:按照我的建议使用标准标记,然后在dragstart 上隐藏标记并显示您的自定义绝对元素。在dragend 上隐藏元素,重新定位标记并再次显示它。这样您就可以保持原生标记行为,并且在拖动时不会看到滞后。

如果您想按照您的问题建议使用滚轮缩放,那么您将遇到问题。滚轮缩放将地图缩放到鼠标光标所在的位置(而不是地图中心),这意味着缩放后,您的标记将不再位于中心。因此,在这种情况下,您需要在缩放后重新居中地图。我使用了以下内容:

google.maps.event.addListener(map, 'idle', function() {
  map.setCenter(marker.getPosition());
});

如果你不这样做,那么你的绝对定位标记将不再是你真正的标记所在的位置......

这是一个工作代码 sn-p。请注意,如果使用信息窗口,您还将面临一些问题。如果标记距离画布边缘太近,Infowindows 可能会导致地图重新定位(例如,如果您将地图高度设置为 150 像素...)。您可能还需要在拖动地图时将其隐藏,否则它将保持在同一位置。

换句话说,这听起来像是很多技巧,因为“只是”在拖动地图和重新定位标记时没有看到一点延迟...... IMO

function initialize() {

  var mapOptions = {
    zoom: 14,
    center: new google.maps.LatLng(52.5498783, 13.425209099999961),
    mapTypeId: google.maps.MapTypeId.ROADMAP,
    scrollwheel: true
  };

  var map = new google.maps.Map(document.getElementById('map-canvas'),
    mapOptions);

  let image = {
    url: 'https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png',
    size: new google.maps.Size(54, 86),
    origin: new google.maps.Point(0, 0),
    anchor: new google.maps.Point(27, 86),
  };

  let marker = new google.maps.Marker({
    map: map,
    position: map.getCenter(),
    icon: image
  });

  let infowindow = new google.maps.InfoWindow({
    content: 'Hello from Marker'
  });

  google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map, marker);
  });

  $('<div/>').addClass('centerMarker').appendTo(map.getDiv());

  google.maps.event.addListener(map, 'idle', function() {
    map.setCenter(marker.getPosition());
  });

  google.maps.event.addListener(map, 'dragstart', function() {

    infowindow.close();
    marker.setVisible(false);
    $('.centerMarker').show();
  });

  google.maps.event.addListener(map, 'dragend', function() {

    marker.setPosition(map.getCenter());
    marker.setVisible(true);
    $('.centerMarker').hide();
  });
}
#map-canvas {
  height: 400px;
}

#map-canvas .centerMarker {
  position: absolute;
  background: url(https://maps.gstatic.com/mapfiles/api-3/images/spotlight-poi2_hdpi.png) no-repeat;
  top: 50%;
  left: 50%;
  z-index: 1;
  margin-left: -27px;
  margin-top: -86px;
  height: 86px;
  width: 54px;
  cursor: pointer;
  display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="map-canvas"></div>

<!-- Replace the value of the key parameter with your own API key. -->
<script async defer src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&libraries=places&callback=initialize">
</script>

【讨论】:

  • 感谢您提供完整的详细信息并感谢您的评论。抱歉,我没有注意到您发送了这么好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
相关资源
最近更新 更多