当前状态
谷歌浏览器进一步发展,在使用隐身模式时没有更多的检测空间。同样可能适用于其他浏览器。
旧解决方案(可能部分有效)
可以为大多数使用的浏览器检测启用的隐私浏览模式。这包括 Safari、Firefox、IE10、Edge 和 Google Chrome。
火狐
当Firefox的隐私浏览模式开启时,IndexedDB会抛出InvalidStateError,因为它在隐私浏览模式下不可用。
非常如果:
var db = indexedDB.open("test");
db.onerror = function(){/*Firefox PB enabled*/};
db.onsuccess =function(){/*Not enabled*/};
苹果浏览器
对于 Safari,关键是本地存储服务。它在隐私模式下被禁用。所以尝试访问它并使用 try-catch 子句。以下方法适用于 OSX 和 iOS 设备。此方法的积分将用于此问答
var storage = window.sessionStorage;
try {
storage.setItem("someKeyHere", "test");
storage.removeItem("someKeyHere");
} catch (e) {
if (e.code === DOMException.QUOTA_EXCEEDED_ERR && storage.length === 0) {
//Private here
}
}
IE10/边缘
Internet Explorer 甚至会在隐私模式下禁用 IndexedDB。所以检查是否存在。但这还不够,因为较旧的浏览器可能甚至没有 IDB。所以再做一次检查,例如对于只有 IE10 和后续浏览器具有/触发的事件。可以在此处找到有关 CodeReview 的相关问题
if(!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)){
//Privacy Mode
}
铬合金
更新:自 Chrome 76 起这不起作用(感谢 @jLynx)
Chromes 隐身模式可以通过文件系统进行验证。一个很好的解释可以在这里找到SO
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
console.log("FS check failed..");
return;
}
fs(window.TEMPORARY, 100, function (fs) {}, function (err) {
//Incognito mode
});