检测Firebug的Javascript?


Answers:


87

原始答案:

检查console对象(仅使用Firebug创建),例如:

if (window.console && window.console.firebug) {
  //Firebug is enabled
}

更新(2012年1月):

Firebug开发人员已决定删除window.console.firebug。您仍然可以通过鸭子输入来检测Firebug的存在,例如

if (window.console && (window.console.firebug || window.console.exception)) {
  //Firebug is enabled
}

其他各种方法,例如

if (document.getUserData('firebug-Token')) ...
if (console.log.toString().indexOf('apply') != -1) ...
if (typeof console.assert(1) == 'string') ...

但一般来说,没有必要这样做。


10
请记住,将您的权力用于善良或令人敬畏,但不要对萤火虫用户造成惩罚,因为这样做可以轻松绕开他们可能感兴趣的任何“复制”或“保存”操作。那是不好的形式。
matt lohkamp,09年

2
IIRC,在具有开发人员模式的Safari中使用console.log也是可以的-因此,“仅使用Firebug创建”语句可能不正确。
alex

4
Safari确实有一个控制台对象,但是Safari的控制台没有firebug属性,因此上述条件在Safari中将失败,因此无法检测到Firebug
Andreas Grech 2009年

我刚刚实现了这一点,将开发人员与站点上的常规用户区分开来是一个好主意。例如,让他们知道您可以使用的API!
卢克

@Luc:您的意思是那些恰巧使用安装了Firebug的Firefox的开发人员。
Andreas Grech'3

20

如果启用了Firebug,则不会取消定义window.console。console.firebug将返回版本号。


9

从Firebug版本1.9.0开始,出于console.firebug隐私考虑,不再定义该属性。请参阅发行说明错误报告这破坏了上述方法。的确,它将艾伦问题的答案变成了“没有办法”。如果另一种方式,它被认为是一个错误。

相反,解决方案是检查console.log是否要使用或替换其可用性。

这是对David Brockman上面介绍的那种代码的替代建议,但不能删除任何现有功能。

(function () {
    var names = ['log', 'debug', 'info', 'warn', 'error', 'assert', 'dir', 'dirxml', 
                'group', 'groupEnd', 'time', 'timeEnd', 'count', 'trace', 'profile', 'profileEnd'];

    if (window.console) {
        for (var i = 0; i < names.length; i++) {
            if (!window.console[names[i]]) {
                window.console[names[i]] = function() {};
            }
        }
    } else {
        window.console = {};
        for (var i = 0; i < names.length; i++) {
            window.console[names[i]] = function() {};
        }
    }
})();

我编辑了原始答案并添加了新的有效检测方法
user123444555621 2012年

4

可能无法检测到。

Firebug具有多个选项卡,可以分别禁用这些选项卡,并且默认情况下现在不启用它们。

原来的GMail只能告诉我是否启用了“控制台”标签。进一步探测可能需要绕过安全措施,并且您不想去那里。


3

您可以使用类似的方法来防止代码中的Firebug调用(如果未安装)导致错误。

if (!window.console || !console.firebug) {
    (function (m, i) {
        window.console = {};
        while (i--) {
            window.console[m[i]] = function () {};
        }
    })('log debug info warn error assert dir dirxml trace group groupEnd time timeEnd profile profileEnd count'.split(' '), 16);
}

2
这真是糟糕的风格。例如,Chrome开发者控制台支持大多数(如果不是全部)这些方法,但没有console.firebug。因此,以上代码禁用了在非Firebug控制台中完美运行的控制台方法,这很糟糕。
scy

2

请记住,在Chrome窗口中Object console]。控制台也会返回true或[ 。

此外,我会检查Firebug是否安装了

if (window.console.firebug !== undefined) // firebug is installed

以下是我在Safari和Chrome中获得的信息,未安装Firebug。

if (window.console.firebug) // true
if (window.console.firebug == null) // true
if (window.console.firebug === null) // false

Is-True和Is-Not运算符显然可以强制输入类型,这在JavaScript中应避免。


2
实际上,要检查是否定义了某些内容,应使用“ if(typeof window.console.firebug!=='undefined')”
。– scy

0

当前,window.console.firebug已由最新的firebug版本删除。因为firebug是基于扩展的JavaScript调试器,所以它在window.console中定义了一些新功能或对象。因此,大多数时候,您只能使用此新定义的功能来检测Firebug的运行状态。

if(console.assert(1) === '_firebugIgnore') alert("firebug is running!"); 
if((console.log+'''').indexOf('return Function.apply.call(x.log, x, arguments);') !== -1)  alert("firebug is running!");

您可以在每个萤火虫中测试这些方法。

最良好的祝愿!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.