Javascript “如何检测”;“请求桌面站点”;iOS Mobile Safari和Chrome的模式?

Javascript “如何检测”;“请求桌面站点”;iOS Mobile Safari和Chrome的模式?,javascript,ios,google-chrome,mobile,Javascript,Ios,Google Chrome,Mobile,当用户使用iOS mobile safari的“请求桌面站点”或iOS Chrome的“请求桌面版本”时,我想发送我网站的iPad版本。似乎只有用户代理在该模式下是不同的,并且似乎不可能检测到。有什么想法吗 我的网站有三个版本:台式机/平板电脑/智能手机。平板电脑版本是桌面版的静态版本,非常动态,大量使用JavaScript(视差效果)。我见过一些人使用Cookie/sessionStorage来检测不断变化的用户代理,例如和 但是,我发现您可以通过交叉引用navigator.platform和

当用户使用iOS mobile safari的“请求桌面站点”或iOS Chrome的“请求桌面版本”时,我想发送我网站的iPad版本。似乎只有用户代理在该模式下是不同的,并且似乎不可能检测到。有什么想法吗


我的网站有三个版本:台式机/平板电脑/智能手机。平板电脑版本是桌面版的静态版本,非常动态,大量使用JavaScript(视差效果)。

我见过一些人使用Cookie/sessionStorage来检测不断变化的用户代理,例如和

但是,我发现您可以通过交叉引用
navigator.platform
navigator.userAgent
跳过所有这些。这是专门针对iOS的,因为我听说Chrome的“请求桌面站点”也会自动更新视口,所以可能不需要对其进行此检查

var iOSAgent = window.navigator.userAgent.match(/iPhone|iPod|iPad/);
var iOSPlatform = window.navigator.platform && window.navigator.platform.match(/iPhone|iPod|iPad/);
var iOSRequestDesktop = (!iOSAgent && iOSPlatform);

另一个卑鄙的攻击是在上使用
platform.maxTouchPoints
。即使请求桌面版本,此字段仍然存在,但在real desktop Safari上,此字段不存在。

请查看此问题的答案:

它可以完美地工作(至少现在是如此)

基本上,当iPad处于“桌面模式”时,它们会宣传自己是MacIntel,但目前没有Mac电脑有触摸屏,因此您会寻找启用触摸功能的MacIntel:

let isIOS = /iPad|iPhone|iPod/.test(navigator.platform) ||
(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)
但你肯定应该看看最初的答案——我不想把功劳归功于:

这似乎不再有效:platform=MacIntel桌面模式(在iPadOS 13 Beta 2上测试)。另外,iPadOS 13在默认情况下似乎正在将桌面模式设置为true(请检查Safari设置)。我目前的解决方法是假定触摸支持仅在iOS/iPadOS上,而不是Mac上,即document.documentElement和Safari中的“ontouchstart”表示桌面模式——然而,这是一个非常肮脏的黑客行为,因为如果苹果推出带有触摸功能的MacBook,它将被破坏。我也不知道笔是怎么处理的。请看这个答案,它很有效;它使用相同的原理,但查找不同的值,并依赖于触摸检测