是否可以通过脚本确定Google Chrome是否处于隐身模式?
编辑: 我的意思是通过用户脚本可以实现,但答案假设JavaScript正在网页上运行。我已经就用户脚本重新询问了问题here。
答案 0 :(得分:208)
是。在隐身模式下禁用FileSystem API。查看https://jsfiddle.net/w49x9f1a/,了解您是否处于隐身模式。
示例代码:
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
console.log("check failed?");
} else {
fs(window.TEMPORARY,
100,
console.log.bind(console, "not in incognito mode"),
console.log.bind(console, "incognito mode"));
}
答案 1 :(得分:18)
一种方法是访问唯一的网址,然后检查该网址的链接是否被CSS视为访问过。
您可以在“侦测隐身”(死链接)中看到此示例。
Research paper by same author to replace Detecting Incognito link above
在main.html
添加iframe,
<iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
,以及一些JavaScript代码:
function checkResult() {
var a = frames[0].document.getElementById('test');
if (!a) return;
var color;
if (a.currentStyle) {
color = a.currentStyle.color;
} else {
color = frames[0].getComputedStyle(a, '').color;
}
var visited = (color == 'rgb(51, 102, 160)' || color == '#3366a0');
alert('mode is ' + (visited ? 'NOT Private' : 'Private'));
}
function setUniqueSource(frame) {
frame.src = "test.html?" + Math.random();
frame.onload = '';
}
然后在test.html
加载到iFrame中:
<style>
a:link { color: #336699; }
a:visited { color: #3366A0; }
</style>
<script>
setTimeout(function() {
var a = document.createElement('a');
a.href = location;
a.id = 'test';
document.body.appendChild(a);
parent.checkResult();
}, 100);
</script>
注意:从文件系统中尝试此操作可能会让Chrome因“不安全的Javascript”而哭泣。它 但是,它将通过网络服务器提供服务。
答案 2 :(得分:8)
您可以在JavaScript中查看JHurrah的answer。除了不突出显示链接外,所有隐身模式都不会保存浏览历史记录和Cookie。来自Google help page:
- 您在隐身时打开的网页和下载的文件 没有记录在您的浏览和 下载历史。
- 关闭所有隐身窗口后,系统会删除所有新Cookie 你已经打开了。
正如您所看到的那样,正常浏览与隐身之间的差异发生在之后您访问网页时,因此当浏览器处于此模式时,浏览器无法与之通信。
您可以使用许多HTTP请求分析器之一(例如this one here)查看浏览器向服务器发送的确切内容。比较正常会话和隐身会话之间的标题,您将看到没有区别。
答案 3 :(得分:6)
在Chrome 74+中,您可以通过estimating the available file system storage space
确定if ('storage' in navigator && 'estimate' in navigator.storage) {
const {usage, quota} = await navigator.storage.estimate();
console.log(`Using ${usage} out of ${quota} bytes.`);
if(quota < 120000000){
console.log('Incognito')
} else {
console.log('Not Incognito')
}
} else {
console.log('Can not detect')
}
答案 4 :(得分:4)
如果您正在开发扩展程序,则可以使用标签API来确定窗口/标签是否隐身。
可以找到更多信息here。
如果您只是在处理网页,那就不容易了,而且它的设计就是这样。但是,我注意到在incongnito中打开数据库(window.database)的所有尝试都失败了,这是因为在隐身时,不允许在用户计算机上留下任何数据痕迹。
我没有测试过,但我怀疑对localStorage的所有调用也都失败了。
答案 5 :(得分:1)
这使用一个promise来等待异步代码设置一个标志,所以我们可以在之后同步使用它。
let isIncognito = await new Promise((resolve, reject)=>{
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) reject('Check incognito failed');
else fs(window.TEMPORARY, 100, ()=>resolve(false), ()=>resolve(true));
});
然后我们可以做
if(isIncognito) alert('in incognito');
else alert('not in incognito');
答案 6 :(得分:0)
基于Alok's Answer的快速复制粘贴功能(注意:这是异步的)
function ifIncognito(incog,func){
var fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) console.log("checking incognito failed");
else {
if(incog) fs(window.TEMPORARY, 100, ()=>{}, func);
else fs(window.TEMPORARY, 100, func, ()=>{});
}
}
用法:
ifIncognito(true, ()=>{ alert('in incognito') });
// or
ifIncognito(false, ()=>{ alert('not in incognito') });
答案 7 :(得分:0)
以下是用ES6语法编写的建议答案,并已稍作清理。
const isIncognito = () => new Promise((resolve, reject) => {
const fs = window.RequestFileSystem || window.webkitRequestFileSystem;
if (!fs) {
reject('Cant determine whether browser is running in incognito mode!');
}
fs(window.TEMPORARY, 100, resolve.bind(null, false), resolve.bind(null, true));
});
// Usage
isIncognito()
.then(console.log)
.catch(console.error)
答案 8 :(得分:-1)
在这里使用承诺解决方案
const isIncognito = () => {
return new Promise((resolve, reject) => {
if ("storage" in navigator && "estimate" in navigator.storage) {
navigator.storage.estimate().then((res) => {
console.log(`Using ${res.usage} out of ${res.quota} bytes.`);
if (res.quota < 120000000) {
resolve(true);
} else {
reject(false);
}
});
} else {
reject(false);
}
});
};
使用方法:
isIncognito().then(yes => console.log(yes)).catch(isnot => console.log(isnot))
答案 9 :(得分:-2)
这在 2021 年 5 月有效:https://jsfiddle.net/2b1dk8oa/
该脚本必须在网页中执行,该网页位于 iframe 中。
try{
var ls = localStorage;
alert("You are not in Incognito Mode.");
}
catch(e) { alert("You are in Incognito Mode."); }
答案 10 :(得分:-4)
隐身模式的文档明确指出网站的行为不会有所不同。我相信这意味着答案是否定的。