2009-04-23 18 views
52

È possibile aggiungere messaggi alla console di errore incorporata di Firefox dal codice JavaScript in esecuzione nelle pagine Web?Accedi a Firefox Error Console da JavaScript

So che ci sono Firebug, che fornisce un oggetto console e una sua console degli errori, ma stavo cercando una soluzione rapida in precedenza e non ho trovato nulla.

Suppongo che potrebbe non essere possibile, per evitare che pagine Web dannose invadano il log?

risposta

32

Non è possibile scrivere sulla console direttamente da JavaScript non attendibile (ad esempio script provenienti da una pagina). Tuttavia, anche se l'installazione di Firebug non ti interessa, ti consigliamo di dare un'occhiata allo Firebug Lite, che non richiede l'installazione nel browser (né, in effetti, richiede nemmeno Firefox). È uno script che puoi includere in qualsiasi pagina web (anche in modo dinamico), che ti darà alcune funzionalità base di Firebug (come console.log()).

+0

Interessante, terrò a mente questo. –

+0

E nel browser * SeaMonkey * (che è anche basato su * Gecko *), è possibile abilitare la registrazione alla console JavaScript tramite la preferenza nascosta 'browser.dom.window.console.enabled' (dal 2.11, vedere [bug 739965] (https://bugzilla.mozilla.org/show_bug.cgi?id=739965)). Questo non ha effetto su * FireBug *, poiché tutti i risultati di 'console.log (...)' appaiono immediatamente nella sua console indipendentemente dal pref. – Bass

3

AFAIK, non è possibile. Ma se sei interessato a come le estensioni in Firefox interagiscono con la console degli errori, check this out.

+0

+1 per Components.utils.reportError - Continuo a dimenticare come si chiama e perdendo tempo per trovarlo di nuovo, più e più volte! – Stefano

6

Vorrei installare Firebug e utilizzare console.log. Se non è possibile farlo, però, si può sempre buttare un errore:

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

Naturalmente, questo si romperà fuori del codice che si sta attualmente in esecuzione, quindi non è possibile utilizzarlo per registrazione dettagliata, ma se riesci a risolvere il problema, penso che sia l'unico modo per ottenere qualcosa che viene disconnesso dalla scatola.

+0

Non sono contro l'installazione di Firebug (che ho ormai), volevo solo sapere con certezza. Lanciare esplicitamente un errore non era un'opzione, perché stavo tracciando il mio codice. –

+2

Se si desidera un messaggio di errore non bloccante (ad esempio, il monitoraggio di una variabile in un ciclo), utilizzare setTimeout ("throw new Error ('Wheeeeeeee!')", 0); –

+2

bazquux è ESATTAMENTE il tipo di errore che volevo informarmi su – bobobobo

1

Se sei interessato, controlla uno script che ho scritto: è una sostituzione Firebug "economica" che non interferisce con nessuna normale console (come Safari o Chrome) ma la estende con quasi tutti i metodi di Firebug :

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

guardare sotto il cofano e vedrete cosa intendo per "a buon mercato". :-)

Combinalo con i serializzatori JSON di YUI o json.org per replicare in qualche modo console.dir.

Firebug e Firebug Lite sono interfacce grafiche decisamente più bello, ma io uso la mia home-grown uno tutto il tempo per mantenere la registrazione in modo sicuro anche per il codice di produzione - senza costante commentare & non-commentando,

33

Sì, è possibile = 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 per una vera e propria funzione di

Questo è un semplice hack, solo per divertimento.

+5

Almeno usa una funzione reale invece di una stringa eval'd ... – nornagon

+4

@nornagon Sì, ho capito, sarebbe più bello con una funzione, ma l'ho fatto in questo modo per essere compatibile con IE bad setTimeout () –

+0

Ah, capisco. Ha senso :) – nornagon

46

Se si definisce una funzione globale che verifica l'esistenza di window.console, è possibile utilizzare Firebug per il tracciamento e suona ancora bello con altri browser e/o se si attiva la console di Firebug tracciando fuori:

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

debug("foo!"); 
+0

+1 questo è utile se si lascia accidentalmente console.log nel codice di produzione. –

+16

Non è necessario avvolgere la funzione console.log. Con il suo involucro si perderà la funzionalità di formatura. Basta assegnarlo a una funzione di debug: 'var debug = function() {}; if (window.console! = undefined) {debug = console.log; } '. Ora puoi anche farlo: 'debug ("% s "," a ")' – ceving

+1

@ceving: sai perché con la tua soluzione in chrome ottengo: 'TypeError: invocation illegale'? –

2

Questa funzione non richiede alcuna estensione o libreria. Tuttavia concede i privilegi completi al sito web pertinente. Nessun problema dato che tu sei colui che lo sviluppa, giusto?


// 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

Questo genera un errore di autorizzazione in Firefox 4: "Autorizzazione negata per ottenere la proprietà XPCComponents.classes". – jmort253

+0

Grazie per il feedback jmort253. Hai provato a concedere la capacità in user_pref come dimostrato in un commento nel codice? – MarcH

+0

Dove viene lanciato l'errore? – MarcH

14

window.console non è definito in Firefox 4 beta 6, anche se Firebug 1.6X.0b1 è attivato e aperto, probabilmente a causa di problemi di privilegio che gli altri discutono. Tuttavia, Firefox 4 ha un nuovo Strumenti> Console Web, e se questo è aperto hai un oggetto window.console e il codice JavaScript non attendibile sulla pagina può usare console.log(). La console Web è in flusso (vedere https://wiki.mozilla.org/Firefox/Projects/Console), potrebbe essere necessario modificare le impostazioni denominate devtools. * In about: config, YMMV.

+1

Questa è la soluzione assolutamente perfetta per la domanda posta. –

0

Oggi ho riscontrato un problema e ho notato che la Console in Firebug ha schede diverse, mentre la mia era in Informazioni depurazione, e devi selezionare l'opzione TUTTO per vedere console.log funzionare senza errori di trowing! Semplice come questo! ; ^)