r0s*_*kar 121 javascript firebug google-chrome google-chrome-devtools
我正在使用这个小脚本来查明Firebug是否已打开:
if (window.console && window.console.firebug) {
//is open
};
Run Code Online (Sandbox Code Playgroud)
它运作良好.现在我正在寻找一种方法来检测Google Chrome的内置Web开发者控制台是否已打开,但我找不到任何提示.
这个:
if (window.console && window.console.chrome) {
//is open
};
Run Code Online (Sandbox Code Playgroud)
不起作用.
编辑:
因此,似乎无法检测Chrome控制台是否已打开.但有一个" 黑客 "有效,但有一些缺点:
所以,我现在要选择Unsigned的答案,但如果有人提出了一个好主意,欢迎他仍然回答我改变所选答案!谢谢!
zsw*_*ang 117
Chrome 65+(2018)
r = /./
r.toString = function () {
document.title = '1'
}
console.log('%c', r);
Run Code Online (Sandbox Code Playgroud)
演示: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);
Run Code Online (Sandbox Code Playgroud)
另一个版本(来自评论)
var element = new Image();
Object.defineProperty(element, 'id', {
get: function () {
/* TODO */
alert('?');
}
});
console.log('%cHello', element);
Run Code Online (Sandbox Code Playgroud)
打印常规变量:
var r = /./;
r.toString = function() {
document.title = 'on';
};
console.log(r);
Run Code Online (Sandbox Code Playgroud)
Uns*_*ned 81
由于原始提问者似乎不再存在,这仍然是可接受的答案,因此添加此解决方案以提高可见性.幸得安东宁·希尔德布兰德的评论上zswang s'的答案././
除非控制台是打开的,否则此解决方案利用了未在已记录对象上调用的事实.
var devtools = function(){};
devtools.toString = function() {
this.opened = true;
}
console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened
Run Code Online (Sandbox Code Playgroud)
更新: toString()
已从Chrome中删除.此解决方案不再有效.
感谢Paul Irish使用Profiler 从Discover DevTools指出这个解决方案:
var devtools = /./;
devtools.toString = function() {
this.opened = true;
}
console.log('%c', devtools);
// devtools.opened will become true if/when the console is opened
Run Code Online (Sandbox Code Playgroud)
这个其他选项可以在页面加载后检测正在打开的停靠检查器,但是无法检测到未停靠的检查器,或者检查器是否已在页面加载时打开.误报也有一些可能性.
function isInspectOpen()
{
console.profile();
console.profileEnd();
if (console.clear) console.clear();
return console.profiles.length > 0;
}
Run Code Online (Sandbox Code Playgroud)
Muh*_*mer 47
非常可靠的黑客
基本上在属性上设置一个 getter 并将其记录在控制台中。显然,只有在控制台打开时才能访问该内容。
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);
});
Run Code Online (Sandbox Code Playgroud)
.on{
color:limegreen;
}
.off{
color:red;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)
Sin*_*hus 21
我创建了devtools-detect,可以检测DevTools何时打开:
console.log('is DevTools open?', window.devtools.open);
Run Code Online (Sandbox Code Playgroud)
您还可以收听活动:
window.addEventListener('devtoolschange', function (e) {
console.log('is DevTools open?', e.detail.open);
});
Run Code Online (Sandbox Code Playgroud)
当DevTools未对接时它不起作用.但是,适用于Chrome/Safari/Firefox DevTools和Firebug.
mol*_*arg 21
console.log(Object.defineProperties(new Error, {
message: {get() {alert('Chrome/Firefox')}},
toString: {value() {(new Error).stack.includes('toString@')&&alert('Safari')}}
}));
Run Code Online (Sandbox Code Playgroud)
演示: https: //jsbin.com/cateqeyono/edit?html,输出
guy*_*uya 15
我找到了一种方法来判断Chrome控制台是否已打开.它仍然是一个黑客,但它的方式更准确,并将工作天气控制台是否取消对接.
基本上在控制台关闭的情况下运行此代码需要约100微秒,而控制台打开时需要大约两倍~200微秒.
console.log(1);
console.clear();
Run Code Online (Sandbox Code Playgroud)
(1毫秒= 1000微秒)
我在这里写了更多关于它的文章.
演示就在这里.
更新:
@zswang找到了目前最好的解决方案 - 看看他的答案
sta*_*all 15
似乎有一些常见的解决方案:
debugger
。棘手的部分是找到一种方法,使计时器不会被事件循环队列中长时间运行的任务弄乱,并且调试器语句会暂停其运行的线程的执行。还有一个挑战是用户可以根据具体情况或禁用全部来禁用常规调试器语句。下面是我针对该debugger
方法的具体问题的解决方案。IE。当主线程在启发式计时器之间运行长任务时,避免误报,避免debugger
语句阻塞主线程,并防止禁用调试器语句。注意:我认为没有办法阻止用户禁用所有调试器断点,这可能是最好的方法。
当开发工具打开且线程遇到调试语句时,Chrome 浏览器会进入调试状态。
eval
语句中以防止用户禁用它)。我已经在 GitHub 上发布了一个参考实现(由我编写),并在此处发布了一个演示。
console.log
,这可以适用于控制台的多个打开-关闭,而不会向控制台发送大量消息。如果你的目标是堵塞开发人员工具,试试这个(我在JS代码被混淆的地方找到了一个更复杂的版本,这非常烦人):
setTimeout(function() {while (true) {eval("debugger");}}, 0);
Run Code Online (Sandbox Code Playgroud)
我写了一篇关于这个的博客文章:http : //nepjua.org/check-if-browser-console-is-open/
它可以检测它是停靠还是未停靠
function isConsoleOpen() {
var startTime = new Date();
debugger;
var endTime = new Date();
return endTime - startTime > 100;
}
$(function() {
$(window).resize(function() {
if(isConsoleOpen()) {
alert("You're one sneaky dude, aren't you ?")
}
});
});
Run Code Online (Sandbox Code Playgroud)
小智 5
我发现新方法在 Chrome 89 上有效
使用 console.profile、setInterval 和函数 toString
var devtools = function() {};
devtools.toString = function() {
alert('NOPE!!')
return '-'
}
setInterval(()=>{
console.profile(devtools)
console.profileEnd(devtools)
}, 1000)
Run Code Online (Sandbox Code Playgroud)
在 safari 中,它不起作用。
在 chrome 89 以下,我无法检查它是否有效。
归档时间: |
|
查看次数: |
68427 次 |
最近记录: |