繁体   English   中英

禁用双击以单击触摸屏 iOS 设备

[英]Disable Double Tap To Click On Touchscreen iOS Devices

所以,最近我一直在开发一个网站,该网站让我改进和做出响应,我面临的问题之一是有许多可点击的元素,混合了 CSS 和悬停状态的 jQuery 效果。

现在,首先我希望所有这些悬停状态都是 CSS,但我遇到的主要问题是在这些悬停状态下,某些元素正在改变displayvisibility css 属性。 我做了一些阅读,显然如果是这种情况,在触摸屏 iOS 设备上,这会导致第一次“触摸”强制悬停状态,然后需要第二次单击才能实际单击元素。

我试图找到一种不需要大量标记和样式更改的解决方案。 最好是利用 jQuery/JavaScript 的修复程序会很好。

我尝试了以下方法:

$(document).ready(function() {
   $('a').on('click touchend', function(e) {
      var el = $(this);
      var link = el.attr('href');
      window.location = link;
   });
});

但是,当用户将手指按住可点击元素并拖动页面进行滚动时,这会出现问题。 当他们在拖动后松开手指时, window.location仍然会改变。

如有必要,我稍后会添加一个 jsFiddle。

提前致谢。

编辑:

这是一个显示问题的 jsFiddle。 http://jsfiddle.net/0bj3uxap/4/如果您点击其中一个块,您会看到它显示悬停状态,然后您需要再次点击以实际触发点击事件。

当一个元素被隐藏,然后悬停状态显示该元素时,似乎会发生这种情况。

看起来我找到了解决方案。

https://github.com/ftlabs/fastclick

FastClick 修复了此问题,并消除了某些移动浏览器的 300 毫秒延迟问题。

只需将库包含在<script>标签中,然后使用 jQuery 或您喜欢的任何方式启动它:

$(document).ready(function() {
    FastClick.attach(document.body);
});

简单解释一下为什么会出现这个问题:

当一个元素被隐藏时,例如当它具有以下任何一个 CSS 属性时:

display: none;
opacity: 0;
visibility: hidden;

然后隐藏元素的悬停状态显示该元素,iOS 不会在第一次触摸时触发点击事件,它会强制悬停状态(显示元素)。 然后用户需要再次触摸该元素以触发点击事件。

我明白为什么要添加这个,但我想我宁愿 iOS 不这样做,然后开发人员只需要定制他们的网站,不隐藏可能至关重要的内容。

如果它对其他人有帮助:就我而言,我遇到了一个非常相似的问题,但这不仅仅是由于:hover样式本身造成的。 相反,这是因为我使用 JavaScript 事件侦听器( touchstarttouchmovetouchend )来更改页面上元素的可见性(无论在哪里)。

就我而言,我只是向<html>标签添加了一个touch类,以检测设备是否能够触摸并且应该始终显示通常只在悬停时显示的某些元素。 我的修复有两个方面:

  1. 移动到 >300 毫秒的延迟(即移动浏览器在确定这是单击还是双击之前通常可能等待的时间)。 就我而言,我只是选择了 500 毫秒(有关原因,请参阅下面的 #2)。
  2. 然后我使用 cookie 临时保留此设置,以便这些元素立即可见,并且在后续页面加载时不需要触摸事件侦听器(因此第一次延迟 500 毫秒不应该是一个交易破坏者)。

示例代码:

在这种情况下,使用 jQuery + https://github.com/carhartl/jquery-cookie (修改为支持maxAge )。

function initTouchSupport() {
    // See if touch was already detected and, if so, immediately toggle the touch classes.
    if ($.cookie('touch-device')) {
        toggleTouch();
        return;
    }

    // Be efficient and listen once and, if ever detected, flag capability and stop listening (for efficiency).
    var events = 'touchstart touchmove touchend';
    $body.on(events, detectTouch);
    function detectTouch() {
        // Detected; retain for a short while (e.g. in case this is a laptop with touch capability and they switch
        // to mouse control). That way there's no delay on the next several page loads and no chance of a double-touch bug.
        $body.off(events, detectTouch);
        $.cookie('touch-device', true, {
            path: '/',
            domain: getDomain(),
            maxAge: 86400 // 86400 seconds = 1 day
        });

        setTimeout(toggleTouch, 500);
    }

    function toggleTouch() {
        // Swap out classes now
        $html.toggleClass('no-touch', false);
        $html.toggleClass('touch', true);
    }
}

我在 IOS 中有一个非常相似的问题,必须双标签按钮等我删除了所有桌面样式,其中包括一些悬停样式,这没有任何区别。 我将悬停样式放回移动 UI 中未使用的样式。 最后,问题是一个名为的 css 类

。错误信息

更正后发现此 css 已在我们的 UI 中使用,并且已链接到鼠标悬停事件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM