-
-
Notifications
You must be signed in to change notification settings - Fork 117
利用toString检测浏览器devTool是否为开启状态 #32
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
可以介绍一下 刚才试了一下,并不是每次打开 devTools 都会执行一次 console.log(Date.now()) 每次打开 devTools 时输出的都是同样的值,并没有每次都重新执行 |
@Tao-Quixote |
你上面说的这个原理我明白; 我不明白的是:为什么在打开 devTools 时会再次执行 |
@Tao-Quixote 没啊,我这里包不包含 |
@haoliangwu // 传递的是 foo 的地址,在输出到控制台时进行隐式类型转换
// 由于转换目标类型为 string,所以调用 toString 方法
function foo () {}
foo.toString= function () {
// 打开 devTools 时的逻辑
...
}
console.log(foo); 而不能通过下面这种方式来实现: function foo () {
// 打开 devTools 时的逻辑
...
}
console.log(foo()) 上面的方式会将 所以,你实验的时候每次都会输出不同的值,而我通过 不知道这样理解对不对?请大佬指点。 |
@Tao-Quixote 嗯,好像是这么一回事,你可以试试@迷渡大佬现身说法一下,哈哈 |
正则,函数,日期都可以,因为控制台会隐式调用这几个 子类同样适用: class MyDate extends Date {};
var f = new MyDate();
f.toString = function () {
console.log(performance.now());
return performance.now();
}
console.log('%s', f); 而对于 Object,只会调用默认的 var f = {};
console.log('%s', f); 输出 var f = {};
f.toString = function () {
console.log(performance.now());
return 'foo';
}
console.log('%s', f); 依然输出 如果想输出 foo,则需要: var f = {};
f.toString = function () {
console.log(performance.now());
return 'foo';
}
console.log('%s', f + '');
// |
// |
// 这里 |
关于检测 devTool 是否为打开状态当前已经有好多方案了,比如轮询检测
window
的内外宽高差、对 html 元素注册 id 的getter
等,但是这些方法要不具有侵入性,要不无法满足 devTool 是悬浮状态的情况,上面的方法可能更好一下,亲测 chrome 和 ff 没问题。The text was updated successfully, but these errors were encountered: