Javascript, das Firebug erkennt?

68

Was ist eine todsichere Methode, um festzustellen, ob ein Benutzer Firebug aktiviert hat?

Allan
quelle
2
nur nebenbei: wofür brauchst du das? Um zu wissen, ob Sie an die Konsole des Firebugs schreiben können oder was?
Andrei Rînea

Antworten:

87

Ursprüngliche Antwort:

Suchen Sie nach dem consoleObjekt (nur mit Firebug erstellt) wie folgt:

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

Update (Januar 2012):

Die Firebug-Entwickler haben beschlossen, zu entfernenwindow.console.firebug . Sie können das Vorhandensein von Firebug immer noch erkennen, indem Sie wie Ente tippen

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

oder verschiedene andere Ansätze wie

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

Im Allgemeinen sollte dies jedoch nicht erforderlich sein.

Pumbaa80
quelle
10
Denken Sie daran, setzen Sie Ihre Kräfte für immer oder großartig ein, aber bestrafen Sie Firebug-Benutzer nicht, weil es so einfach ist, jede Art von "Kopieren" oder "Speichern" von Aktionen zu umgehen, an denen sie interessiert sein könnten. Das wäre eine schlechte Form.
Matt Lohkamp
2
IIRC, die Verwendung von console.log in Safari bei aktiviertem Entwicklermodus, funktioniert ebenfalls. Daher ist die Anweisung "Nur mit Firebug erstellt" möglicherweise falsch.
alex
4
Safari hat zwar ein Konsolenobjekt, aber die Konsole von Safari hat keine firebugEigenschaft, und daher schlägt die obige Bedingung in Safari fehl und erkennt Firebug nicht
Andreas Grech
Ich habe dies gerade implementiert und es ist eine wirklich gute Idee, Entwickler von regulären Benutzern auf Ihrer Website zu trennen. Zum Beispiel, indem Sie sie über eine API informieren, die ihnen zur Verfügung steht!
Luc
@ Luc: Du meinst Entwickler, die zufällig Firefox mit installiertem Firebug verwenden.
Andreas Grech
20

Wenn Firebug aktiviert ist, ist window.console nicht undefiniert. console.firebug gibt die Versionsnummer zurück.

ceejayoz
quelle
9

Ab Firebug Version 1.9.0 console.firebugist dies aus Datenschutzgründen nicht mehr definiert. Siehe Versionshinweise , Fehlerbericht . Dies bricht die oben genannten Methoden. In der Tat ändert es die Antwort auf Allans Frage in "Es gibt keinen Weg"; wenn es ist eine andere Art und Weise, ist es ein Fehler betrachtet.

Die Lösung besteht stattdessen darin, die Verfügbarkeit von zu überprüfen console.log oder was auch immer Sie verwenden oder ersetzen möchten, .

Hier ist ein Vorschlag für einen Ersatz für die Art von Code, den David Brockman oben vorstellt, der jedoch keine vorhandenen Funktionen entfernt.

(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() {};
        }
    }
})();
skagedal
quelle
Ich habe die ursprüngliche Antwort bearbeitet und neue, funktionierende Erkennungsmethoden hinzugefügt
user123444555621
4

Es kann unmöglich sein, zu erkennen.

Firebug verfügt über mehrere Registerkarten, die möglicherweise separat deaktiviert werden und jetzt standardmäßig nicht aktiviert sind.

GMail kann nur sagen, ob ich die Registerkarte "Konsole" aktiviert habe oder nicht. Eine weitere Prüfung würde wahrscheinlich eine Sicherheitsumgehung erfordern, und Sie möchten nicht dorthin gehen.

Kent Fredric
quelle
3

Sie können so etwas verwenden, um zu verhindern, dass Firebug-Aufrufe in Ihrem Code Fehler verursachen, wenn er nicht installiert ist.

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);
}
David Brockman
quelle
2
Das ist wirklich ein schlechter Stil. Beispielsweise unterstützt die Chrome-Entwicklerkonsole die meisten (wenn nicht alle) dieser Methoden, verfügt jedoch nicht über console.firebug. Daher deaktiviert dieser Code oben perfekt funktionierende Konsolenmethoden in Nicht-Firebug-Konsolen, was scheiße ist.
scy
2

Beachten Sie, dass in Chrome window.console auch true oder [zurückgegeben wird Object console].

Außerdem würde ich prüfen, ob Firebug mit installiert ist

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

Unten ist, was ich in Safari und Chrome bekomme, kein Firebug installiert.

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

Die Is-True- und Is-Not-Operatoren üben offensichtlich Zwang aus, was in JavaScript vermieden werden sollte.

Steve K.
quelle
2
Um zu überprüfen, ob etwas definiert ist, sollten Sie "if (typeof window.console.firebug! == 'undefined')" verwenden.
scy
0

Derzeit wurde die window.console.firebug von der neuesten Firebug-Version entfernt. weil firebug ein erweiterungsbasierter JavaScript-Debugger ist, der eine neue Funktion oder ein neues Objekt in window.console definiert hat. In den meisten Fällen können Sie diese neu definierten Funktionen nur verwenden, um den laufenden Status von Firebug zu erkennen.

sowie

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!");

Sie können diesen Ansatz in jedem Firebug testen.

Die besten Wünsche!

Hao Dong
quelle