经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
浏览器开发者工具打开检测
来源:cnblogs  作者:空山与新雨  时间:2023/9/25 16:49:37  对本文有异议

目录

方法一console.log

在safari中,如果打开了控制台,console.log打印日期实例、函数实例、正则实例会触发两次toString方法,那么可以重写toString方法检测是否打开了控制台。

  1. let count = 0;
  2. const temp = () => {}
  3. temp.toString = () => {
  4. count++;
  5. return "";
  6. }
  7. console.log(temp);
  8. alert(count)
  9. if (count >= 2) {
  10. alert('打开了开发中工具');
  11. }

在safari中,如果打开了控制台,console.logdom节点的时候会触发dom节点上id的getter方法,通过自定义这个getter方法来检测是否打开了safari的控制台。

  1. const ele = document.createElement("a");
  2. Object.defineProperty(ele, "id", {
  3. get: () => {
  4. alert('打开了开发中工具')
  5. },
  6. });
  7. console.log(ele)

在Firefox中,如果打开了控制台,console.log正则时候会触发正则的toString方法,那么可以重写toString方法来检测是否打开了控制台。(适用于火狐浏览器, 不适用于chrome safari edge)

  1. const temp = /\./
  2. temp.toString = () => {
  3. alert('打开了开发中工具');
  4. return "";
  5. }
  6. console.log(temp);

方法二: debugger

debugger只有在打开控制台的情况下才会触发,而人的手动跳过断点又没有那么快,这中间就有了个时间差,依据这个时间差来判断是否打开了控制台

  1. function detectDebug() {
  2. const date = Date.now();
  3. debugger;
  4. // 你的手不可能快于0.1秒
  5. if (Date.now() - date > 100) {
  6. alert('打开了控制台')
  7. }
  8. }
  9. detectDebug()

方法三:console.table

控制台打开的情况下,console.table的参数如果是一个大对象数组,会比较耗时,而console.log耗时和console.table的耗时差了个量级,通过对比两者的耗时来确定是否打开了控制台。

通过测试总结,如果console.table的耗时超过 console.log的十倍可以确定打开了控制台。

  1. // 创建一个大的数组对象
  2. function createArr() {
  3. const obj = {};
  4. for (let i = 0; i < 200; i++) {
  5. obj[i] = i;
  6. }
  7. const arr = [];
  8. for (let i = 0; i < 100; i++) {
  9. arr.push(obj);
  10. }
  11. return arr;
  12. }
  13. let arr = createArr();
  14. function calculateTime(func) {
  15. const start = Date.now();
  16. func();
  17. return Date.now() - start;
  18. }
  19. // 时间耗时
  20. const tableConsumeTime = calculateTime(() => console.table(arr));
  21. const logConsumeTime = calculateTime(() => console.log(arr));
  22. console.clear()
  23. alert('logPrintTime:' + logConsumeTime)
  24. alert('tablePrintTime:' + tableConsumeTime)
  25. if (tableConsumeTime > logConsumeTime * 10) {
  26. alert('打开了控制台')
  27. }

方法四:内容宽度

当控制台打开状态下,页面的展示内容是被侵占的,所以可以使用window.outerWidth - window.innerWidth 宽度差来确定是否打开了控制台

有一些情况需要考虑:

  1. 页面缩放会影响window.innerWidth
  2. iframe的window.innerWidth是自己的宽度,而不是顶层页面的宽度
  3. 360浏览器等会有一个边栏放置一些功能菜单,这时候就要将这个差值考虑在内。
  4. 新版chrome浏览器的收藏夹和阅读清单可以在右侧打开一个菜单栏,这个菜单栏也会占用内容区域。
  1. function check(){
  2. let screenRatio = window.devicePixelRatio
  3. if(!screenRatio && window.screen.deviceXDPI && window.screen.logicalXDPI ){
  4. screenRatio = window.screen.deviceXDPI / window.screen.logicalXDPI
  5. }
  6. const widthFlag = window.outerWidth - window.innerWidth * screenRatio > 200;
  7. const heightFlag = window.outerHeight - window.innerHeight * screenRatio > 300;
  8. if (widthFlag || heightFlag) {
  9. alert('打开了控制台')
  10. }
  11. }
  12. check()
  13. window.addEventListener('resize', () => {
  14. setTimeout(() => {
  15. check();
  16. }, 1000);
  17. }, true);

总结

  1. 优先使用方法一,可以在safari firefox中起作用
  2. chrome中使用方法二
  3. 如果禁用了debugger,可以使用方法三,不过方法三属于经验总结,并不一定准确,可能会误判。
  4. 方法四误判的概率更大,如果可以确定目标浏览器,则可以针对性的使用。

原文链接:https://www.cnblogs.com/walkermag/p/17727733.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号