我有一个Javascript应用程序,它依赖于捕获textarea中的键盘事件。在使用firebug(1.10.2)在Firefox(14.x)上测试和调试它时,我发现当我的断点处于活动状态且调试器工作正常时,我的应用程序的行为会有所不同。
我知道如何检测Firebug但是我想知道当Firebug实际用于调试时是否可以检测(使用Javascript)?
编辑:以下是一些随机网站上的示例
This site在输入框中捕获键事件,打印出字符代码并用文本表示替换按下的键(即输入键为“enter”)或大写字母(如果是字母)。 / p>
当我使用Chrome调试它并在侦听器函数上放置一个断点时,到达断点时没有任何反应(正如预期的那样),当我恢复脚本时,文本将正常打印出来。
当我在Firefox上使用Firebug进行调试时:让我们说之前我按下“e”字母,输入栏包含文本“E”。我打开断点并按下字母“z”。 Firebug在断点处停止,但输入栏现在有文本“Ez”而不是“E”。当我恢复脚本时,此文本将按预期替换为“Z”。
我尝试了另一个Firefox调试器(Venkman 0.9.89)并且发生了同样的事情。所以我的猜测是这是一个Firefox问题,而不是调试器问题。所以问题可能更一般,是否可以检测到Javascript代码何时被调试?
答案 0 :(得分:2)
这就是我检测Firebug的方法:
if (window.console && (window.console.firebug || window.console.exception)) {
// At this point, Firebug is enabled
}
第一个测试对于确保控制台实际存在很重要第二个测试将测试Firebug,尽管它只适用于它的旧版本。第三个是因为Firebug添加了“异常”这是因为属性“异常”是由Firebug的插件添加的。
(不相关但感兴趣:window.console.exception
是Firebug用于在控制台上显示消息的方法。例如,键入:
>>> window.console.exception("A message", {param:'Value'})
您将看到一个看起来非常熟悉的错误,转储传递的对象!
Merc的。
答案 1 :(得分:0)
嗯,希望这个答案对某人有帮助。
让我们调试的函数如:
function debugged()
{
debugger;
}
setTimeout(debugged, 3000);
添加此调试检测代码为:
setTimeout(this.x = function(a){ s = Math.abs(new Date() - a.c - 1000); a.c = new Date(); setTimeout(a.foo,1000, a); if(s>100)console.log("debug") },1000, {c: new Date(), foo:this.x})
因此,如果我们在某个地方运行它并打开调试器,它将触发断点并且将捕获调试事件(您可以通过控制台中出现的“debug”字来看到它)。这是一个概念,您可以更改检测周期时间和提高调试标志的方法。感谢单线程javascript。