【问题标题】:Modernizr.touch returns true on firefox browserModernizr.touch 在 Firefox 浏览器上返回 true
【发布时间】:2014-03-31 22:21:37
【问题描述】:

我写了一段代码来获取基于触摸和非触摸的事件。它适用于所有其他浏览器和设备,但 Firefox 除外。默认FF返回true

var thumbsEvent, isTouch = Modernizr.touch; // detect the touch
if(isTouch){
   thumbsEvent = 'click';//on touch surface, click
}
else {
   thumbsEvent = 'mouseover';//on non touch surface, mouseover
}

有没有办法解决这个问题。

Example fiddle

【问题讨论】:

  • 有趣。从这里返回 false。 FF 27 和赢 7。
  • @Bob 谢谢,你对 FF 进行了任何配置更改吗?
  • 不。我确实发现了这一点,但您可能会感兴趣:github.com/Modernizr/Modernizr/pull/920#issuecomment-17433197
  • 当前版本的 FF 对我来说是错误的
  • 这里的模式假设“无触摸”==“有鼠标”,这并不总是正确的。键盘无法触发 mouseover 事件,因此只有键盘的用户将无法执行交互(例如打开菜单)。通常建议总是绑定click事件,无论检测结果如何,因为这是所有输入法都可以以一种或另一种方式触发的“通用”事件。见“The Golden Pattern”“Touch And Mouse”

标签: javascript firefox modernizr touch-event


【解决方案1】:

至少从 FF27 开始,这是一个已知的 Firefox 错误:https://bugzilla.mozilla.org/show_bug.cgi?id=970346

【讨论】:

    【解决方案2】:

    代表 Modernizr - 对此我们深表歉意。

    Modernizr.touch 在尚未发布的 3.0 版本中已重命名为 Modernizr.touchevents,因为它是对检测的更准确描述。基本上,所有这些检测所做的都是检查触摸事件的存在,如果找到它们则返回 true。如果您启用开发人员工具,桌面 chrome 会做同样的事情。这只是意味着您的笔记本电脑上的 Firefox 版本报告支持触摸事件,可能有几个原因。

    【讨论】:

    • Modernizr.touchEvents 未定义,但 Modernizr.touchevents 是布尔值。
    • 对此感到抱歉。 Modernizr 总是小写
    • 那么,有什么办法可以预防呢?
    【解决方案3】:

    有同样的问题:Modernizr.touch 在桌面 FireFox 33.1、Mac OS 上返回 true。

    我的解决方案:使用移动优先的方法,默认应用所有与触摸相关的花里胡哨。如果 Modernizr 检测到 .no-touch,则为桌面用户应用(或禁用)某些网站功能。

    【讨论】:

      【解决方案4】:

      对此有一个临时修复。我遇到了同样的问题,所以我做了一点挖掘以找到一个 html5 属性,该属性被 FF 检测到但在移动设备上没有,我发现 flexbox 就是其中之一。 (阅读:http://html5please.com/#flexbox)。 下面是您可以用来解决问题的代码:

      var isTouch = Modernizr.touch, // detect the touch
          isFlex = Modernizr.flexbox; // detect flexbox
      
      if (isTouch) {
          // Detect if FF
          if (isFlex) ) {
             thumbsEvent = 'mouseover'; //on FF, mouseover
          } else {
             thumbsEvent = 'click';//on non-FF touch surface, click
          }
      } else {
         thumbsEvent = 'mouseover';//on non touch surface, mouseover
      }
      

      请注意,这是暂时的,如果移动设备开始支持 flexbox,它将无法工作。

      【讨论】:

        【解决方案5】:

        我遇到了同样的问题,这为我解决了:在 Firefox 中转到“about:config”,然后搜索设置“dom.w3c_touch_events.enabled”并重置该设置。然后我不得不重新启动 Firefox,然后“Modernizr.touch”为我正确返回“false”。

        来源:https://github.com/Modernizr/Modernizr/issues/1225

        【讨论】:

        • 添加了 +1,但这会解决客户 Firefox 浏览器上的问题吗? ;)
        【解决方案6】:

        前段时间我也遇到过同样的问题。

        问题在于,某些笔记本电脑型号带有触摸屏版本。我们发现,如果有人使用这样的模型,Modernizr.touch 会返回 true,即使此人使用的是非触控笔记本模型版本。

        现在,点击事件确实适用于触控设备,但反之则不行。所以我们通过添加一个额外的检查来解决这个限制:

        var thumbsEvent, isTouch = Modernizr.touch;
        var isAndroid = ...; // Android detection code
        var isIOs = ...; // iOS detection code
        
        // touch is only supported on iOS and Android
        // devices, which have for sure a touch interface
        if(isTouch && (isAndroid || isIOs) ){
            thumbsEvent = 'click';
        }
        else {
            thumbsEvent = 'mouseover';
        }
        

        这可能不是最佳解决方案,因为您需要使用用户代理嗅探而不是特征检测来进行设备检测,这可能是您首先使用 Modernizr 的原因。

        此外,支持触摸但既不是 iOS 也不是 Android 的设备将被排除在触摸事件之外。

        【讨论】:

          猜你喜欢
          • 2019-01-29
          • 1970-01-01
          • 2011-09-18
          • 2012-11-11
          • 2015-07-18
          • 2021-12-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-23
          相关资源
          最近更新 更多