您可以通过脚本确定Chrome是否处于隐身模式吗?

时间:2010-05-26 00:04:23

标签: javascript google-chrome incognito-mode

是否可以通过脚本确定Google Chrome是否处于隐身模式?

编辑: 我的意思是通过用户脚本可以实现,但答案假设JavaScript正在网页上运行。我已经就用户脚本重新询问了问题here

11 个答案:

答案 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)

隐身模式的文档明确指出网站的行为不会有所不同。我相信这意味着答案是否定的。