2009-04-23 10 views
52

Ist es möglich, Nachrichten zu der integrierten Fehlerkonsole von Firefox aus JavaScript-Code in Webseiten zu öffnen?Log to Firefox Error Console von JavaScript

Ich weiß, dass ich dort Firebug ist, die ein console Objekt und seine eigene Fehlerkonsole bietet, aber ich suchte nach einer schnellen Lösung früher und konnte nichts finden.

Ich denke, es könnte überhaupt nicht möglich sein, zu verhindern, dass bösartige Webseiten das Protokoll spammen?

Antwort

32

Sie können nicht direkt aus nicht vertrauenswürdigem JavaScript (z. B. Skripts von einer Seite) in die Konsole schreiben. Aber selbst wenn die Installation von Firebug Ihnen nicht zusagt, würde ich Ihnen empfehlen, sich Firebug Lite anzuschauen, was keine Installation im Browser erfordert (und tatsächlich sogar Firefox erfordert). Es ist ein Skript, das Sie in jede Webseite einfügen können (sogar dynamisch), was Ihnen einige grundlegende Firebug-Funktionen gibt (zB console.log()).

+0

informieren wollte Interessant, ich werde das im Hinterkopf behalten. –

+0

Und im Browser * SeaMonkey * (der auch * Gecko * -basiert ist) können Sie die Protokollierung an der JavaScript-Konsole über die versteckte Einstellung browser.dom.window.console.enabled aktivieren (seit 2.11, siehe [Bug 739965] (https://bugzilla.mozilla.org/show_bug.cgi?id=739965)). Dies wirkt sich nicht auf * FireBug * aus, da alle 'console.log (...)' Ergebnisse sofort in der Konsole angezeigt werden, unabhängig von der Präferenz. – Bass

3

AFAIK ist es nicht möglich. Aber wenn Sie daran interessiert sind, wie Erweiterungen in Firefox mit der Fehlerkonsole interagieren, check this out.

+0

+1 für Components.utils.reportError - Ich vergesse immer wieder, wie es heißt und Zeit verschwenden, es wieder und wieder zu finden! – Stefano

6

Ich würde nur Firebug installieren und console.log verwenden. Wenn Sie das nicht tun können, obwohl, können Sie immer einen Fehler aus:

throw "foobar"; 
throw new Error("bazquux"); 

Natürlich, dieses Sie aus dem Code brechen, die Sie zur Zeit der Ausführung sind, so können Sie es nicht für den Einsatz detaillierte Protokollierung, aber wenn Sie umgehen können, denke ich, dass es der einzige Weg ist, etwas aus der Box ausgeloggt zu bekommen.

+0

Ich bin nicht dagegen, Firebug zu installieren (was ich inzwischen habe), ich wollte es nur sicher wissen. Explizit einen Fehler zu werfen, war keine Option, weil ich meinen Code verfolgte. –

+2

Wenn Sie eine nicht blockierende Fehlermeldung (z. B. das Überwachen einer Variablen in einer Schleife) möchten, verwenden Sie setTimeout ("new wrore ('Wheeeeeeee!')", 0); –

+2

bazquux ist genau die Art von Fehler, den ich mich über – bobobobo

1

Wenn Sie interessiert sind, schauen Sie sich ein Skript an, das ich geschrieben habe - es ist ein "billiger" Firebug-Ersatz, der keine normale Konsole (wie Safari oder Chrome) beeinträchtigt, aber fast alle Firebug-Methoden erweitert :

http://code.google.com/p/glentilities/

Blick unter die Motorhaube und Sie werden sehen, was ich mit „billig“ bedeuten. :-)

Kombinieren Sie es mit den JSON-Serializern von YUI oder json.org, um die Konsole.dir zu replizieren.

Firebug und Firebug Lite sind auf jeden Fall schöner GUIs, aber ich meine home-grown man die ganze Zeit sicher auch für die Produktion Code behalten Protokollierung - ohne konstant zu kommentieren & un-Kommentierung

33

Ja, Sie können = P

function log(param){ 
    setTimeout(function(){ 
     throw new Error("Debug: " + param) 
    },0) 
} 

//Simple Test: 
alert(1) 
log('This is my message to the error log -_-') 
alert(2) 
log('I can do this forever, does not break') 
alert(3) 

Update auf eine echte Funktion

Dies ist ein einfaches Hack, nur so zum Spaß.

+5

Benutze mindestens eine echte Funktion anstelle eines ausgewerteten Strings ... – nornagon

+4

@nornagon Ja, ich bekomme den Punkt, es wäre schöner mit einer Funktion, aber ich habe diesen Weg gemacht, um kompatibel mit IE bad setTimeout () –

+0

Ah, ich verstehe. Macht Sinn :) – nornagon

46

Wenn Sie eine globale Funktion definieren, die für die Existenz von window.console prüft, können Sie Firebug zum Aufspüren und spielt immer noch schön mit anderen Browsern und/oder wenn Sie drehen Firebug Konsole Tracing aus:

debug = function (log_txt) { 
    if (typeof window.console != 'undefined') { 
     console.log(log_txt); 
    } 
} 

debug("foo!"); 
+0

+1 Dies ist nützlich, wenn Sie console.log in Ihrem Produktionscode versehentlich verlassen. –

+16

Es ist nicht notwendig, die console.log-Funktion zu umbrechen. Durch das Umschließen verlieren Sie die Formatierungsfunktionalität. Ordnen Sie es einfach einer Debug-Funktion zu: 'var debug = function() {}; if (window.console! = nicht definiert) {debug = console.log; } '. Jetzt können Sie das auch tun: 'debug ("% s "," a ")' – ceving

+1

@ceving: Wissen Sie warum mit Ihrer Lösung in Chrome bekomme ich: 'TypeError: Illegal Invocation'? –

2

Diese Funktion benötigt keine Erweiterung oder Bibliothek. Es gewährt jedoch volle Rechte für die relevante Website. Keine Sorge, da du derjenige bist, der es entwickelt, oder?


// Define mylog() function to log to Firefox' error console if such a 
// thing exists 
function defineMyLog() 
{ 
    // Provide a useless but harmless fallback 
    mylog = function(msg) { }; 
    // return; // disable in production 

    if (typeof(netscape) === "undefined") { 
     // alert("Logging implemented only for Firefox"); 
     return; 
    } 
    // The initial auth popup can be avoided by pre-setting some magic user_pref 
    // ("capability.principal.codebase.p0.granted", "UniversalXPConnect"), etc. 
    try { 
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 
    } catch (e) { // User has denied privileges 
     // alert(e.name + ": " + e.message); 
     return; 
    } 
    ffconsoleService = Components.classes["@mozilla.org/consoleservice;1"] 
           .getService(Components.interfaces.nsIConsoleService); 
    mylog = function (msg) 
    { 
     netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); 
     ffconsoleService.logStringMessage(new Date().toLocaleTimeString() + ": " + msg); 
    } 
    mylog("Firefox logging function has been defined"); 

    // window.open("javascript:"); // this URL does not work anymore? 
} 
+0

Dies wirft einen Berechtigungsfehler in Firefox 4: "Berechtigung verweigert, um Eigenschaft XPCComponents.classes zu erhalten". – jmort253

+0

Danke für die Rückmeldung jmort253. Haben Sie versucht, die Berechtigung in user_pref zu gewähren, wie in einem Kommentar im Code gezeigt? – MarcH

+0

Wo genau wird der Fehler geworfen? – MarcH

14

window.console wird in Firefox 4 Beta 6 noch nicht definiert, wenn Firebug 1.6X.0b1 aktiviert und offen ist, wahrscheinlich wegen des Privilegs Probleme, die anderen zu diskutieren. Firefox 4 verfügt jedoch über eine neue Tools> Webkonsole. Wenn diese Option geöffnet ist, haben Sie ein window.console-Objekt und nicht vertrauenswürdiger JavaScript-Code auf der Seite kann console.log() verwenden. Die Webkonsole ist in Bewegung (siehe https://wiki.mozilla.org/Firefox/Projects/Console), möglicherweise müssen Sie die Einstellungen mit dem Namen "devtools. *" In "about: config, YMMV" ändern.

+1

Dies ist die absolut perfekte Lösung für die gestellte Frage. –

0

Ich hatte heute ein Problem, und beachten Sie, dass die Konsole in Firebug verschiedene Registerkarten hat, und meine war in Depuration Information, und Sie müssen die Option ALL auswählen, um console.log arbeiten ohne trowing Fehler! Einfach so! ;)

Verwandte Themen