浏览器无痕模式检测JS脚本在JsFiddle正常但本地/托管环境失效咨询
无痕模式检测脚本部署后失效原因
核心原因
你使用的检测逻辑完全基于数年前的浏览器私有特性和旧版行为,目前绝大多数主流浏览器已经修改了这些特性在无痕模式下的表现,仅在JSFiddle的iframe沙箱环境中还能触发旧行为,部署到顶级上下文(本地/自有主机)就会失效,具体问题点如下:
webkitRequestFileSystem是Chrome早已废弃的API,Chrome 86+版本无痕模式下已经允许访问临时文件系统,原有逻辑中请求该API失败判定为无痕的规则完全失效- Firefox分支的判定逻辑依赖已废弃的
MozAppearance私有前缀样式,且当前Firefox无痕模式已经支持IndexedDB正常访问,原有触发onerror判定为无痕的规则不再生效 - Safari分支的判定逻辑基于旧版Safari无痕模式写入localStorage抛错的特性,Safari 15+版本无痕模式下已经支持写入localStorage,仅在窗口关闭时清空数据,原有捕获异常判定为无痕的规则失效
- IE10/旧Edge的判定逻辑完全不适用于现在的Chromium内核Edge浏览器,没有实际作用
修复方案
- 替换过时的检测逻辑,改用当前通用的检测方案:Chromium内核浏览器可通过
navigator.storage.estimate()判断存储配额,无痕模式下可用配额通常远低于正常模式;Firefox可通过Cache API的行为判断;Safari可通过IndexedDB的限额特性判断 - 移除所有已废弃的私有前缀API依赖,这类API的行为随时会被浏览器修改,没有长期兼容性保证
- 统一处理所有异步检测逻辑的时序,避免回调还未执行就提前返回判定结果的问题
内容的提问来源于stack exchange,提问作者Topup
相关产品推荐
相关产品推荐

