小编典典

查看 Chrome 控制台是否已打开

all

我正在使用这个小脚本来确定 Firebug 是否打开:

if (window.console && window.console.firebug) {
    //is open
};

而且效果很好。现在找了半个小时,想办法检测谷歌浏览器内置的web开发者控制台是否打开,但是找不到任何提示。

这个:

if (window.console && window.console.chrome) {
    //is open
};

不起作用。

编辑:

所以似乎无法检测 Chrome 控制台是否打开。但是有一个“
hack ”可以工作,但有一些缺点:

  • 控制台未停靠时将不起作用
  • 在页面加载时打开控制台时将不起作用

所以,我现在会选择Unsigned麓的答案,但是如果有人提出了一个绝妙的主意,欢迎他仍然回答,我改变选择的答案!谢谢!


阅读 86

收藏
2022-07-29

共1个答案

小编典典

requestAnimationFrame(2019 年末)

将这些先前的答案留在这里作为历史背景。目前Muhammad Umer的方法适用于 Chrome78,具有检测关闭和打开事件的额外优势。

非常可靠的黑客

基本上在属性上设置一个吸气剂并将其记录在控制台中。显然,只有在控制台打开时才能访问该东西。

https://jsfiddle.net/gcdfs3oo/44/

var checkStatus;
var indicator = document.querySelector('#devtool-status');

var element = new Image();
Object.defineProperty(element, 'id', {
  get: function() {
    checkStatus='on';
    throw new Error("Dev tools checker");
  }
});

requestAnimationFrame(function check() {
  checkStatus = 'off';
  console.dir(element);
  indicator.className  = checkStatus;
  requestAnimationFrame(check);
});
.on{
  color:limegreen;
}

.off{
  color:red;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.7.1/css/all.css" integrity="sha256-DVK12s61Wqwmj3XI0zZ9MFFmnNH8puF/eRHTB4ftKwk=" crossorigin="anonymous" />

<p>
  <ul>
    <li>
      dev toolbar open: icon is <span class="on">green</span>
    </li>
    <li>
      dev toolbar closed: icon is <span class="off">red</span>
    </li>
  </ul>
</p>
<div id="devtool-status"><i class="fas fa-7x fa-power-off"></i></div>
<br/>
<p><b>Now press F12 to see if this works for your browser!</b></p>

函数 toString (2019)

感谢
Overcl9ck
对此答案的评论。/./用空函数对象替换正则表达式仍然有效。

var devtools = function() {};
devtools.toString = function() {
  if (!this.opened) {
    alert("Opened");
  }
  this.opened = true;
}

console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened

正则表达式 toString (2017-2018)

由于最初的询问者似乎不再存在并且这仍然是公认的答案,因此添加此解决方案以提高可见性。归功于Antonin
Hildebrand对zswang回答的评论。该解决方案利用了除非控制台打开,否则不会在记录的对象上调用的事实。toString()

var devtools = /./;
devtools.toString = function() {
  if (!this.opened) {
    alert("Opened");
  }
  this.opened = true;
}

console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened

控制台.profiles (2013)

更新: console.profiles已从 Chrome 中删除。此解决方案不再有效。

感谢Paul Irish使用分析器从中指出了这个解决方案:

function isInspectOpen() {
  console.profile();
  console.profileEnd();
  if (console.clear) {
    console.clear();
  }
  return console.profiles.length > 0;
}
function showIfInspectIsOpen() {
  alert(isInspectOpen());
}


<button onClick="showIfInspectIsOpen()">Is it open?</button>

window.innerHeight (2011)

此其他选项可以在页面加载 后检测停靠的检查器正在打开, 但无法检测未停靠的检查器,或者检查器是否已在页面加载时打开。还有一些误报的可能性。

window.onresize = function() {
  if ((window.outerHeight - window.innerHeight) > 100) {
    alert('Docked inspector was opened');
  }
}
2022-07-29