ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-06-11 04:21:53  阅读:435  来源: 互联网

标签:javascript leaflet dispatchevent touchmove


您知道当您使用移动设备并向下滚动具有谷歌地图的网页时.地图变暗并告诉您“用两根手指移动地图”.
enter image description here

我想在我的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,leaflet,dispatchevent,touchmove
来源: https://codeday.me/bug/20190611/1216260.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有