了解 Chrome 主机是否已打开

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

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

而且效果很好。现在我搜索了半个小时,以找到一种方法来检测Google Chrome的内置Web开发人员控制台是否打开,但我找不到任何提示。

这:

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

不起作用。

编辑:

因此,似乎无法检测Chrome控制台是否打开。但是有一个“黑客”是有效的,但有一些缺点:

  • 当控制台未与坞站连接时将不起作用
  • 在页面加载时打开控制台时将不起作用

所以,我现在要选择Unsigned的答案,但是如果某人1想出了一个绝妙的想法,欢迎他仍然回答,我改变选择的答案!谢谢!


答案 1

请求动画框架(2019 年末)

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

功能到字符串 (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

正则表达式到字符串 (2017-2018)

由于原始的提问者似乎不再存在,这仍然是公认的答案,因此添加此解决方案以提高可见性。这要归功于Antonin Hildebrandzswang答案的评论。此解决方案利用了除非控制台处于打开状态,否则不会对记录的对象调用的事实。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

控制台配置文件 (2013)

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

感谢 Paul Irish 使用 profiler 从 Discover DevTools 中指出此解决方案:

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

答案 2

铬 65+ (2018)

    r = /./
    r.toString = function () {
        document.title = '1'
    }
    console.log('%c', r);

演示: https://jsbin.com/cecuzeb/edit?output (更新于 2018-03-16)

包装:https://github.com/zswang/jdetects


打印“元素”时,Chrome开发人员工具将获得其ID

    var checkStatus;
    
    var element = document.createElement('any');
    element.__defineGetter__('id', function() {
        checkStatus = 'on';
    });
    
    setInterval(function() {
        checkStatus = 'off';
        console.log(element);
        console.clear();
    }, 1000);

另一个版本(来自评论)

var element = new Image();
Object.defineProperty(element, 'id', {
  get: function () {
    /* TODO */
    alert('囧');
  }
});
console.log('%cHello', element);

打印常规变量:

    var r = /./;
    r.toString = function() {
      document.title = 'on';
    };
    console.log(r);