gpt4 book ai didi

javascript - .__defineGetter__ 如何用于检测浏览器中的控制台是否打开

转载 作者:行者123 更新时间:2023-11-30 00:11:17 33 4
gpt4 key购买 nike

我一直在阅读 the source code here它检测控制台何时打开,如果打开则播放音频元素。

我对一些事情感到困惑。

首先,我不知道它是如何检测到控制台已打开的。

if( audioCheck === true || (window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized)) {
play();
}

下面的行返回 undefined 所以触发 play() 函数的是 audioCheck === true

window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized

正是以下行将 audioCheck 设置为 true。我对 __defineGetter__ 做了一些研究,但我仍然不清楚。

audioElement.__defineGetter__('id', function() {
audioCheck = true;
});

谁能解释一下这是做什么的?经过大量研究,我无法弄清楚。

最后让我彻底崩溃的是,如果我删除这一行,音频将无法播放:

console.log("Check the console: ", audioElement);

这真的很奇怪,虽然这应该只将信息记录到控制台,并且对是否播放声音没有任何影响,但我想这必须与 __defineGetter__ 联系起来

这里有很多问题,因此非常感谢任何可以阐明这些问题的问题。

最佳答案

我不知道有任何来源可以证实这一点1,但您遇到的行为很可能是现代浏览器控制台通常执行的操作的结果——如果您发出 console .log() 并传递一个 HTML 元素作为其参数,控制台将尝试显示其详细信息,例如 ID。 __defineGetter__ 行确保当浏览器访问 ID 时,伪造的 getter 函数被调用(__defineGetter__() 只是一种非标准的设置方式——或替换——对象的 getter 属性2)。很聪明,不是吗?

1可能需要分析各种浏览器的源代码才能完全理解和验证问题。
2在 MDN 上阅读更多关于 getter 的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get (请注意,如其中所述,标准方法是调用 Object.defineProperty())。

关于javascript - .__defineGetter__ 如何用于检测浏览器中的控制台是否打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36391198/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com