首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测"Inspect Element“何时打开

检测"Inspect Element“何时打开
EN

Stack Overflow用户
提问于 2017-02-13 05:52:18
回答 1查看 19.2K关注 0票数 47

Samy Kamkar的网站http://samy.pl知道控制台何时打开,并在打开时清除源代码/控制台。

这是怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-13 06:41:50

这花了一些功夫。samy.pl在此代码之上有几个级别的间接和模糊处理。它使用的检测代码版本与JohanP找到的the GitHub repository版本不同。与GitHub存储库不同,samy.pl中的代码可以在devtools未停靠时检测到它们。

它通过使用一个简短的脚本来实现这一点,该脚本根据devtools是打开还是关闭而执行不同。

示例脚本

这是一个自包含的示例;在浏览器中打开它,并注意当devtools打开和关闭时输出是如何变化的(无论它是否停靠):

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <body>
        <pre id="output"></pre>
        <script type="text/javascript">
            var element = new Image;
            var devtoolsOpen = false;
            element.__defineGetter__("id", function() {
                devtoolsOpen = true; // This only executes when devtools is open.
            });
            setInterval(function() {
                devtoolsOpen = false;
                console.log(element);
                document.getElementById('output').innerHTML += (devtoolsOpen ? "dev tools is open\n" : "dev tools is closed\n");
            }, 1000);
        </script>
    </body>
</html>

它是如何工作的

setInterval每秒执行一次。无论devtools是打开还是关闭,console.log都将始终执行:console对象始终是已定义的。但是,log方法仅在devtools打开时才将输出写入控制台。如果devtools是关闭的,那么console.log就是一个no-op。这是让您检测devtools是否打开的关键:检测日志操作是否为no-op。

在将element写入控制台的过程中,它获取元素的id。它调用附加了__defineGetter__的函数。因此,只有当devtools打开并且console.log不是no-op时,console.log(element)才会调用该函数。在该函数中设置了该标志,每秒为我们提供devtools状态的更新视图。

samy.pl使用一些额外的技巧来隐藏这一点:控制台也每秒被清除一次,并且此代码使用空格(!)进行混淆。编码。

票数 59
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42193700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档