参考Chrome浏览器模拟设备分辨率和触摸事件的功能:https://developer.chrome.com/devtools/docs/device-mode
实际问题:
'ontouchstart' in document.documentElement
在设备仿真模式下,返回false
(当它实际上能够执行触摸事件时)。因此,我需要设备模式仿真的例外。
答案 0 :(得分:4)
您需要在窗口中检查ontouchstart
。不是document.documentElement。
通过以下方式检测触摸事件:
'TouchEvent' in window && 'ontouchstart' in window
我应该提一下,我不包括Modernizr使用的window.DocumentTouch
方法。它仅适用于Firefox< 25,Mozilla在Windows上放弃了Touch Metro UI。因此,我不会看到任何合理或相关的浏览器用法,以便再次证明它的合理性。虽然TouchEvent in window
不是必需的,但我认为检查API的存在还有其未来的证据和技术上的正确性。
有关触摸事件检测的详细信息,请参阅最新的Modernizr Touch Event Feature Detect,其中包含评论中的链接和参考。
答案 1 :(得分:1)
我结束了:
window.navigator.userAgent.indexOf('Mobile') !== -1;
Chrome会在设备模拟模式下将Mobile
添加到userAgent,例如" Mozilla / 5.0(iPhone; CPU iPhone OS 10_3,如Mac OS X)AppleWebKit / 602.1.50(KHTML,如Gecko)CriOS /56.0.2924.75 移动 / 14E5239e Safari / 602.1"
不幸的是,当你打开/关闭设备模式时,'的TouchEvent'在窗口&& ' ontouchstart'在窗口
没有实时提供正确的状态
答案 2 :(得分:1)
正如亚历克斯(Alex)所说的那样,打开/关闭设备时实时状态正确不受六溴环十二烷的影响。
所以我所做的就像这样
navigator.maxTouchPoints === 1
是否表明我们处于仿真模式(我不确定100%,需要在带触摸屏的台式机/笔记本电脑中进行检查)const isBrowserSimulation = () => {
// maxTouchPoints is always = 1 on simulation mode
return (
isTouchDevice() && // https://stackoverflow.com/a/51774045/14238203
navigator.maxTouchPoints === 1 &&
// Alex solution finding 'mobile' in UA covers `getHasLiedBrowser` missing emulation on android devices
(getHasLiedBrowser() || window.navigator.userAgent.indexOf('Mobile') !== -1)
);
};
根据我对Chrome,Edge和Brave最新版本的测试,该解决方案可在Chrome上实时切换移动设备仿真。