javascript – Leaflet JS – 实现手势处理以强制执行2个手指滚动

您知道当您使用移动设备并向下滚动具有谷歌地图的网页时.地图变暗并告诉您“用两根手指移动地图”.
javascript  –  Leaflet JS  – 实现手势处理以强制执行2个手指滚动

我想在我的Leaflet地图中实现这一点. Leaflet目前不提供此类功能.

Google将此功能称为手势处理.如果将其设置为“Cooperative”,您将获得我刚才描述的效果.
https://developers.google.com/maps/documentation/javascript/interaction

很容易检测到正在使用的手指数量并显示消息,如我的代码示例所示.
(您需要在移动设备或模拟器上运行此功能才能看到它有效)

如果它是1个手指我取消touchmove事件并显示我的警告.
否则,我允许该事件应用于地图.
但是我需要弄清楚在我在地图上取消它之后将一个手指触摸事件应用到包含页面的方法.这样用户就可以滚动页面了.

有没有人有任何好的想法如何实现这一目标?我想过使用dispatchEvent将收到的touchmove事件对象直接中继到父文档.
例如:
document.dispatchEvent(touchmoveevent);
但没有运气.也许有更好的整体方法.

var myMap = L.map('mapid').setView([51.505, -0.09], 13);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  maxZoom: 19
}).addTo(myMap);

$("#mapid").on("touchmove", function(e) {
  if (e.touches.length !== 2) {
    $('.mask').fadeIn();
    return false;
  }
});

$("#mapid").on("touchend", function(e) {
  if ($('.mask').is(':visible')) {
    $('.mask').fadeOut();
  }
});
#mapid {
  height: 600px;
}

.mask {
  display: none;
  position: absolute;
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.8);
  top: 0;
  left: 0;
  z-index: 400;
}

.message {
  color: #ffffff;
  position: absolute;
  width: 100%;
  text-align: center;
  top: 50%;
  transform: translateY(-50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.3.1/dist/leaflet.css" integrity="sha512-Rksm5RenBEKSKFjgI3a41vrjkw4EVPlJ3+OiI65vTjIdo9brlAacEuKOiQ5OFh7cOI1bkDwLqdLw3Zg0cRJAAQ==" crossorigin="" />
<script src="https://unpkg.com/leaflet@1.3.1/dist/leaflet.js" integrity="sha512-/Nsx9X4HebavoBvEBuyp3I7od5tA0UzAxs+j83KgC8PU0kgB4XiK4Lfe4y4cgBtaRJQEIFCW+oC506aPT2L1zw==" crossorigin=""></script>

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">

  <head>

    <body>
      <h1>Leaflet Map</h1>

      <div id="mapid"></div>
      <div class="scroll-shield"></div>
      <div class="mask">
        <div class="message">
          <p>Use two fingers to move the map</p>
        </div>
      </div>

      <h2>Stuff below</h2>
      <ul>
        <li>Here</li>
        <li>is</li>
        <li>some</li>
        <li>stuff</li>
        <li>below</li>
      </ul>

    </body>

解决方法:

关键是确保在初始化地图时禁用拖动,点击和滚动窗口缩放.

然后在2次手指拖动时暂时重新启用它们,或者检测到使用命令或ctrl键滚动.

我现在已将此解决方案打包成一个传单插件.

https://github.com/elmarquis/Leaflet.GestureHandling

上一篇:如何在javascript中正确初始化ErrorEvent?


下一篇:jsonp 使用总结