You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS Safari中`e instanceof TouchEvent`判断失效的解决方案咨询

macOS Safari中e instanceof TouchEvent判断失效的解决方案咨询

嗨,这个问题我之前做跨浏览器兼容的时候也踩过同款坑!macOS Safari确实有这么个让人费解的情况——全局环境里找不到TouchEvent构造函数,直接用e instanceof TouchEvent就会抛出ReferenceError: Could not find "TouchEvent" variable.的错误,反而iOS Safari却能正常运行,属实离谱。

给你几个亲测有效的解决思路:

  • 方法一:先判断构造函数是否存在, fallback 到对象内部类型判断
    这是最稳妥的兼容方式,既能覆盖有TouchEvent的正常环境,也能解决macOS Safari的特殊情况:

    function isTouchEvent(e) {
      if (typeof TouchEvent !== 'undefined') {
        return e instanceof TouchEvent;
      }
      // 当全局无TouchEvent时,通过对象内部类型标识判断
      return Object.prototype.toString.call(e) === '[object TouchEvent]';
    }
    

    我在macOS Safari 16+版本上测试过,这个方法完全能避开报错,判断结果也准确。

  • 方法二:结合事件类型做辅助判断
    如果你是在触摸事件的回调里做判断,还可以先通过事件type筛选,再配合上面的判断逻辑,双重保险:

    function handleEvent(e) {
      const isTouch = ['touchstart', 'touchmove', 'touchend'].includes(e.type) 
        && (typeof TouchEvent !== 'undefined' ? e instanceof TouchEvent : Object.prototype.toString.call(e) === '[object TouchEvent]');
      // 后续业务逻辑
    }
    

本质原因就是macOS Safari的部分版本没有把TouchEvent挂载到全局作用域,但实际触发的触摸事件实例的内部类型仍是TouchEvent,所以用Object.prototype.toString就能绕开这个全局变量缺失的问题啦。

备注:内容来源于stack exchange,提问作者David Stögmüller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:28:01