Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 你能通过脚本确定Chrome是否处于匿名模式吗?_Javascript_Google Chrome_Incognito Mode - Fatal编程技术网

Javascript 你能通过脚本确定Chrome是否处于匿名模式吗?

Javascript 你能通过脚本确定Chrome是否处于匿名模式吗?,javascript,google-chrome,incognito-mode,Javascript,Google Chrome,Incognito Mode,是否有可能通过脚本确定谷歌浏览器是否处于匿名模式 编辑:我的意思是,通过用户脚本是否可以,但答案是假设JavaScript正在网页上运行。我已经问了关于用户脚本的问题 一种方法是访问唯一的URL,然后检查指向该URL的链接是否被CSS视为已访问 你可以在“侦测隐姓埋名”(死链接)中看到一个例子 在main.html中添加一个iframe <iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src=

是否有可能通过脚本确定谷歌浏览器是否处于匿名模式


编辑:我的意思是,通过用户脚本是否可以,但答案是假设JavaScript正在网页上运行。我已经问了关于用户脚本的问题

一种方法是访问唯一的URL,然后检查指向该URL的链接是否被CSS视为已访问

你可以在“侦测隐姓埋名”(死链接)中看到一个例子

main.html
中添加一个iframe

 <iframe id='testFrame' name='testFrame' onload='setUniqueSource(this)' src='' style="width:0; height:0; visibility:hidden;"></iframe>
然后在加载到iFrame的
test.html
中:

<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> 

a:链接{color:#336699;}
a:访问{color:#3366A0;}
setTimeout(函数(){
var a=document.createElement('a');
a、 href=位置;
a、 id=‘测试’;
文件.正文.附件(a);
parent.checkResult();
}, 100);
注意:从文件系统尝试这一点会让Chrome哭喊“不安全的Javascript”。信息技术
但是,将在Web服务器上工作。

您可以在JavaScript中查看JHurrah的。除了不突出显示链接外,所有匿名模式都不保存浏览历史记录和cookie。来自谷歌:

  • 您在匿名时打开的网页和下载的文件 没有记录在您的浏览和 下载历史记录
  • 关闭所有匿名窗口后,将删除所有新cookie 你已经打开了
正如您可以看到的,在您访问网页后,正常浏览和隐姓埋名之间的差异,因此,在这种模式下,浏览器与服务器之间没有任何通信


您可以使用许多HTTP请求分析器中的一个来查看浏览器到底向服务器发送了什么,如。比较正常会话和incognito之间的标题,您将看不到任何差异。

如果您正在开发扩展,则可以使用tabs API确定窗口/选项卡是否为incognito

可以找到更多信息

如果你只是在处理一个网页,这并不容易,而且它就是这样设计的。但是,我注意到,在incognito中打开数据库(window.database)的所有尝试都会失败,这是因为在incognito中,不允许在用户计算机上留下任何数据痕迹


我还没有测试它,但我怀疑对localStorage的所有调用也会失败。

*Edit;以下内容不再适用于Chrome:*

对。文件系统API在匿名模式下被禁用。当您处于或不处于匿名模式时,请检查

示例代码:

var fs=window.RequestFileSystem | | window.webkitRequestFileSystem;
如果(!fs){
日志(“检查失败?”);
}否则{
财政司司长(临时窗口),
100,
console.log.bind(控制台,“不处于匿名模式”),
console.log.bind(控制台,“匿名模式”);
}
基于的快速函数(注意:这是异步的)

更新-不再工作

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') });
更新此功能似乎不再有效

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, ()=>{});
    }
} 

这使用了一个承诺来等待异步代码设置标志,因此我们可以在之后同步使用它

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');

以下是用ES6 syntaxt编写的建议答案,稍微整理一下

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)

在Chrome 74至84.0.4147.135中,您可以通过

if(导航器中的“存储”和navigator.storage中的“估计”){
const{usage,quota}=wait navigator.storage.estimate();
log(`Using${usage}超出${quota}字节。`);
如果(配额<120000000){
console.log('Incognito')
}否则{
console.log('notincognito')
}   
}否则{
console.log('无法检测')
}

这里是使用承诺的解决方案

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);
      }
    });
  };
这项工作将于2021年5月开始:


如果您可以很容易地确定它:),那么它就不会是非常隐姓埋名的(
incognito
),并且您必须记住,用户必须允许扩展手册使用隐姓埋名模式。默认情况下,一切都是真的。@Mohamed:必须允许的用户应该是我,所以这不会是问题:)@Petalvin或者该网站可以通过检测隐姓埋名来降低价值。《波士顿环球报》的网站不会以匿名方式展示其文章,从而防止用户规避免费文章配额。总的来说,我更喜欢一个对我了解较少的网站。这很酷,我没有意识到匿名模式不会突出显示访问过的链接。但这需要用户单击链接。不需要,iframe会“单击”链接。这实际上不起作用,因为大多数浏览器不会通过javascript公开:已访问的样式信息。CSS界面将显示链接是否具有未访问的颜色。这是WebKit和Gecko浏览器中的一项安全措施,至少从2010年开始。这是为了保护用户的历史记录(例如,用户可以尝试所有可能的URL,并将访问过的URL发送给第三方。通过这种方式,用户可以访问URL中的令牌,等等)。Mozilla官方文章解释了有关
:visted
:最近,它禁用除用户特别标记为匿名安全的扩展之外的所有扩展。这是最不黑客的方式,应该在顶部。干净而优雅。@user2718671在mac osx上的最新Chrome中仍然适用于我。奇怪…我试过Chrome。它可以工作,但逻辑是相反的。这很快就会消失,多亏chrome v 77.0.3865.90中的commitsfail。它不再工作了(可能在过去工作过)刚刚更新了我的chrome,现在仍然可以工作。我看到你在上面发表了同样的评论,然后说你错了,只是向未来的观众指出了这一点(请随意删除你的评论,如果你这样做的话,我会删除这一条)。这看起来非常有趣,是一种Javascript形式,我不熟悉,而且在Windows 10中我的Netbeans 8.2 IDE似乎不支持这种形式。但如果我能让它工作,我也很好奇:我能替换
reject('Check inc.)吗
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))
try{
    var ls = localStorage;
    alert("You are not in Incognito Mode.");
}
catch(e) {  alert("You are in Incognito Mode.");  }