Leaflet: ios:dragging = false,但无法在地图上滚动

创建于 2017-03-29  ·  20评论  ·  资料来源: Leaflet/Leaflet

如何繁殖

  • 我正在使用的宣传单版本:1.0.3
  • 我正在使用的浏览器(带有版本):Safari / 602.1
  • 我正在使用的OS /平台(带有版本):iOS 10

我期望什么行为,我看到什么行为

dragging被禁用时,我希望在ios上拖动地图时页面会滚动。 相反,什么也没有发生。 在android上,如果dragging = false,我可以通过拖动来滚动。

重现问题的最小示例

在ios上,在地图上拖动时无法滚动页面:

https://jsfiddle.net/geg8yLe3/

这类似于#5343

help wanted in progress

最有用的评论

我可以确认以下代码似乎是一种有效的解决方法,可确保一个手指滚动页面而不是地图,同时仍允许两指缩放和平移地图以及点击标记。 当地图是需要滚动的较大页面的一部分时,这可以提高移动设备的可用性。

L.map('map', {
    dragging: !L.Browser.mobile,
    tap: !L.Browser.mobile
})

已在iOS 10 Safari和Chrome中确认。 尚未在Android上进行全面测试。

所有20条评论

这听起来很像#4051,应该已经在#4552中修复了。 让我们看看为什么该修复程序现在不起作用。

我在Android设备上尝试了该提琴,该提琴可以按预期工作,并且启用拖动也可以按预期工作,因此它看起来像是iOS特定的错误。

查看http://caniuse.com/#feat = css-touch-action,似乎iOS仅部分支持touch-action ,这可能是此问题的原因。

在链接的小提琴中,地图上有touch-action: pan-x pan-y; -解决此特定问题的方法是为iOS设置touch-action: auto;@oberhamsi您能否验证在当前(https://github.com/Leaflet/Leaflet/blob/364bc7773568070aad596d58001018b0f0b6bb62/dist/leaflet.css#L54)之前添加额外规则touch-action: auto的问题是否已解决? 在这种情况下,将欢迎公关。

可悲的是它没有帮助:我更新了小提琴,在.leaflet-touch-zoom上设置了touch-action:auto .leaflet-touch-zoom 。 然后我还设置pointer-event:auto.leaflet-tile-container ,但仍然没有效果。

https://jsfiddle.net/geg8yLe3/6/

事件处理程序之一可以做preventDefault吗?

@oberhamsi嗯,这很奇怪。

关于preventDefault ,一旦禁用拖动处理程序,就不应有任何侦听器,因为在这种情况下L.Draggable被禁用并注销其侦听器。

@oberhamsi ,如果您能深入研究并尝试调试正在发生的事情,那将很有趣,但是不幸的是,我无法轻松访问任何iOS设备。

有没有解决的办法? 仍然有这个问题。

@GeorgeColdham可悲的是,没有。 正如我在上一条评论中提到的那样,由于无法轻松访问任何要测试的iOS设备,我陷入了困境,因为它确实可以在Android上正常工作。

我们需要检查iOS上触发了哪些CSS规则或事件处理程序,从而阻止了地图滚动,因此,我们将不胜感激!

我也有同样的问题。 我在IOS中使用webview。 但是,如果没有Web预览,也会出现问题。 我在chrome和safari上进行了测试。 我的设备是iPhone 4s

你好
我可以使用本地android浏览器“ com.android.browser”重现此内容。
用户代理:
Mozilla/5.0 (Linux; Android 5.0.2; LG-D802/V30f Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/34.0.1847.118 Mobile Safari/537.36

Google Maps JS SDK具有与iOS / Android相同的功能。 据我所见,它无需触摸即可工作。 知道他们是怎么做的吗?

@perliedman我认为根本的问题是这里的touchstart处理程序中的preventDefaulthttps :

如果我删除了它(或在选项中添加了tap = false),它将在iOS上运行。 该问题也会在版本55之前的Android上的Chrome中出现(Chrome自版本55起支持指针事件,然后在Leaflet中使用不同的代码路径)。 如果您在Android设备上转到chrome:// flags并将指针事件设置为Disabled ,则可以进行检查。

@herrernst呵呵,很好的分析! 谢谢!

绝对是导致此的轻敲处理程序。 查看我们在#4051中使用的测试代码,实际上我们有tap: false

因此,目前,解决方法是不仅设置dragging: false而且还要设置tap: false以实现所需的行为。

我已经提交了#5670来解决这个问题,因此除非有模拟事件的处理程序,否则我们不会preventDefault作为模拟事件的源。

@perliedman感谢您的响应和补丁!

至少在最新的beta版本的Firefox 2上可以在android(7.0)上重现

我可以确认以下代码似乎是一种有效的解决方法,可确保一个手指滚动页面而不是地图,同时仍允许两指缩放和平移地图以及点击标记。 当地图是需要滚动的较大页面的一部分时,这可以提高移动设备的可用性。

L.map('map', {
    dragging: !L.Browser.mobile,
    tap: !L.Browser.mobile
})

已在iOS 10 Safari和Chrome中确认。 尚未在Android上进行全面测试。

我还确认它可以在iOS 11.3.1中使用,同时适用于Safari和Chrome 66
并在android chrome 66上

@SimonEast似乎可以在Android上的移动FireFox中很好地工作,Chrome不太喜欢它。 放大整个网站。 iOS(11.4)Safari和FF运作良好。 我尝试了4或5种不同的CSS / JS技巧,最后,这一技巧开箱即用。 谢谢。

有人找到解决方案了吗?
我将draggingtapfalse ,但仍然无法正常工作。

我将draggingtapfalse ,但仍然无法正常工作。

@HlaingTinHtun
可能是您的情况与所讨论的不同。 请提供样本小提琴以使我们重现您的问题。

绝对是导致此的轻敲处理程序。

然后可以使用#7026进行修复。

测试页面在这里: https :

因此它看起来像是iOS特定的错误。

我可以确认不是。
相同的做法在Firefox 68.6的Android上可重现,似乎是由L.Map.Tap 。 如已报道。

此页面是否有帮助?
0 / 5 - 0 等级