Dzh*_*eyt 5 php mobile user-experience jquery-mobile
我知道有很多方法可以检测移动用户(主要是通过检查用户代理)。
但是许多移动浏览器都具有所谓的“桌面模式”,该模式为网站提供了更多功能环境。
有没有一种方法可以仅向这些以这种模式浏览的移动用户提供特定功能(例如jQuery滑块)?我真正遇到的问题是,从本质上讲,他们的用户代理在两种模式下都是相同的(例如“ Opera Mini 9.0.1”),因此从网站管理员的角度来看-我怎么知道他们在移动设备上,但是在桌面模式下浏览网站?
在 Android Chrome 上,“桌面模式”会从用户代理中删除“Android”字符串。如果您可以使用 JavaScript,以下内容主要检测 Android Chrome 桌面模式:
var webkitVer = parseInt(/WebKit\/([0-9]+)|$/.exec(navigator.appVersion)[1], 10); // also matches AppleWebKit
var isGoogle = webkitVer && navigator.vendor.indexOf('Google') === 0; // Also true for Opera Mobile and maybe others
var isAndroid = isGoogle && userAgent.indexOf('Android') > 0; // Careful - Firefox and Windows Mobile also have Android in user agent
var androidDesktopMode = !isAndroid && isGoogle && (navigator.platform.indexOf('Linux a') === 0) && 'ontouchstart' in document.documentElement;
Run Code Online (Sandbox Code Playgroud)
它假设配备 ARM 处理器的 Chrome 是 Android。对于在 ARM 上运行 Linux 的用户来说,这个假设肯定会失败,对于在 i686 或 MIPS 等上运行 Android 的用户来说,这个假设肯定会失败(而且我还无法测试 ChromeOS)。
对于 Windows Mobile,您可以通过检查字符串“WPDesktop;”来检测桌面模式。在用户代理中。
编辑:过去使用的代码window.chrome是window.chrome.webstore一个可靠的测试,但在 Chrome 65 左右,您无法再使用这些属性来检测桌面模式。感谢@faks 提供的信息。
编辑2:我现在强烈建议不要将“桌面模式”视为“移动模式”,但是,以下是我的更新意见:
请注意,检测桌面模式的代码非常脆弱,较新的浏览器版本经常会破坏嗅探代码技术
除非你有严重的错误或关键的可用性问题,否则完全不值得嗅探
如果您没有积极维护代码并针对浏览器的 beta 版本进行测试,请不要嗅探
我在 iOS 上使用以下内容:navigator.vendor.indexOf('Apple') === 0 && 'ontouchstart' in document.body. 我们需要这个来为 iPadOS 13 正确设置糟糕的 iOS inputMode(旧的 navigator.platform 技术现在在 iOS 13 Beta 中被破坏),并避免其他输入类型的其他 iOS 可用性错误。我认为你可以检查window.screen.width == 768嗅探iPad(即使方向改变也保持不变)。如果 Macbook 推出触控版本,这种嗅觉就会被打破。
我现在使用以下内容来检测 Android 桌面模式:'ontouchstart' in document.body && navigator.platform.indexOf('Linux a') === 0 && (window.chrome || (window.Intl && Intl.v8BreakIterator)). 可怕的不可靠的嗅觉,但我们确实需要它,因为 Android 视口和捏缩放(不是页面缩放)在 Android 上对于我们的 SPA 来说确实很糟糕(屏幕尺寸不够,因为桌面触摸用户可以使用小窗口)。
以下是 iOS Safari 用户的相关代码。本质上,用户代理在桌面模式下丢失了对 iPhone/iPod/iPad 的引用,但该信息仍然存在于 navigator.platform 中:
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);
Run Code Online (Sandbox Code Playgroud)