当前状态
使用隐身模式时,谷歌浏览器得到了进一步的发展,并且没有更多的检测空间。其他浏览器可能也是如此。
旧的解决方案(可能会部分起作用)
可以为大多数使用的浏览器检测已启用的私有浏览模式。这包括Safari,Firefox,IE10,Edge和Google Chrome。
火狐浏览器
启用Firefox的私有浏览模式后,IndexedDB会引发InvalidStateError,因为它在私有浏览模式下不可用。
非常要的是:
var db = indexedDB.open("test");
db.onerror = function(){};
db.onsuccess =function(){};
苹果浏览器
对于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) {
}
}
IE10 / Edge
在隐私模式下,Internet Explorer甚至将禁用IndexedDB。因此,检查是否存在。但这还不够,因为较旧的浏览器甚至可能没有IDB。因此,请执行另一项检查,例如,仅IE10和后续浏览器具有/触发的事件。可以在这里找到有关CodeReview的相关问题
if(!window.indexedDB && (window.PointerEvent || window.MSPointerEvent)){
}
铬
更新:自Chrome 76起,此方法不起作用(感谢@jLynx)
文件系统可以验证Chrome无痕模式。一个很好的解释可以在这里找到
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
console.log("FS check failed..");
return;
}
fs(window.TEMPORARY, 100, function (fs) {}, function (err) {
});