javascript - 检测 "Inspect Element"何时打开

标签 javascript

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

enter image description here

这是如何工作的?

最佳答案

这需要一些挖掘。 samy.pl 在此代码之上有几个级别的间接和混淆。它使用与 the GitHub repository 不同版本的检测代码由 JohanP 发现。 samy.pl 中的代码与 GitHub 存储库不同,可以检测到 devtools当它们没有停靠时。

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

示例脚本

这是一个独立的例子;在浏览器中打开它并注意随着开发工具打开和关闭(无论是否停靠)输出如何变化:

<!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 每秒执行一次。 console.log 始终执行,无论开发工具是打开还是关闭:console 对象始终已定义。但是,log 方法仅在开发工具打开时将输出写入控制台。如果 devtools 关闭,console.log 是空操作。这是让您检测开发工具是否打开的关键:检测日志操作是否为空操作。

在向控制台写入element的过程中,获取元素的id。这会调用 __defineGetter__ 附带的函数.因此,console.log(element) 仅在开发工具打开且 console.log 不是空操作时调用该函数。该标志在该函数中设置,每秒为我们提供 devtools 状态的更新 View 。

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

关于javascript - 检测 "Inspect Element"何时打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42193700/

相关文章:

javascript - 无法在 PHP 上编译共享扩展

javascript - 使用数据对象的变量创建一个 js 文件 - Silverstripe 3.1

JavaScript 获取当前时间不工作 Firefox

javascript - 错误: [$resource:badcfg] query when testing a resource service with Jasmine

javascript - 删除特定周的数据

javascript - 让 DataTables 不过滤某些行

javascript - Google map - 多个标记 - 1 个 InfoWindow 问题

javascript - ckeditor updateElement() 错误

javascript - Rails Javascript 错误 - TypeError : $(. ..).S3Uploader 不是函数

javascript - 当 Controller 返回空结果时,如何在jsp中显示空值?