2009-06-17 12 views
17

Sto cercando di creare un javascript un'infrastruttura registrazione degli errori.non window.onerror sparare in Firefox

Sto cercando di impostare window.onerror essere il mio gestore degli errori. Funziona in IE 6, ma quando lo eseguo in Firefox, si imbatte in qualche metodo in conflitto onerror.

var debug = true; 

MySite.Namespace.ErrorLogger.prototype = { 

    //My error handling function. 
    //If it's not in debug mode, I should get an alert telling me the error. 
    //If it is, give a different alert, and let the browser handle the error. 
    onError: function(msg, url, lineNo) { 
     alert('onError: ' + msg); 
     if (!debug) { 
      alert('not debug mode'); 
      return true; 
     } 
     else { 
      alert(msg); 
      return false; 
     } 
    } 
} 

//Document ready handler (jQuery shorthand) 
$(function() { 
    log = $create(MySite.Namespace.ErrorLogger); 

    window.onerror = log.onError; 

    $(window).error(function(msg, url, line) { 
     log.onError(msg, url, line); 
    }); 
}); 

Se uso setTimeout("eval('a')", 1); dove 'a' è una variabile non definita, il mio gestore degli errori è ciò che è licenziato (che funziona). Tuttavia, il mio error-logger deve catturare tutti gli errori lanciati dai client che accedono al sito web, non solo il codice errato in un unico posto.

Il codice è in una pagina js che viene chiamato dalla pagina di base (C#) di un sito web. Il sito utilizza anche jQuery, quindi ho una funzione che sovrascrive la funzione bind jQuery, e quella funzione funziona bene sia in Firefox 3 che in IE 6.

So che Firefox sta vedendo l'errore perché si presenta in entrambi i Errore Console e Firebug, ma la funzione mywindow.onerror non viene ancora chiamata.

Ogni pensiero su come ignorare ciò che Firefox sta facendo?

+2

Qualcun altro nel mio gruppo ha assunto questo progetto e ha completamente cambiato tutto ciò che stavo facendo, quindi non saprò mai cosa c'è che non va. –

risposta

23

Di seguito è provato e funzionando in IE 6 e Firefox 3.0.11:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
    <script type="text/javascript"> 
    window.onerror = function (msg, url, num) { 
     alert(msg + ';' + url + ';' + num); 
     return true; 
    } 
    </script> 
    <div> 
    ...content... 
    </div> 
    <script type="text/javascript"> 
    blah; 
    </script> 
</body> 
</html> 

Se qualche altra libreria JavaScript che si sta caricando è anche attaccandosi a window.onerror si può fare questo:

<script type="text/javascript"> 
function addHandler(obj, evnt, handler) { 
    if (obj.addEventListener) { 
     obj.addEventListener(evnt.replace(/^on/, ''), handler, false); 
    // Note: attachEvent fires handlers in the reverse order they 
    // were attached. This is the opposite of what addEventListener 
    // and manual attachment do. 
    //} else if (obj.attachEvent) { 
    // obj.attachEvent(evnt, handler); 
    } else { 
     if (obj[evnt]) { 
      var origHandler = obj[evnt]; 
      obj[evnt] = function(evt) { 
       origHandler(evt); 
       handler(evt); 
      } 
     } else { 
      obj[evnt] = function(evt) { 
       handler(evt); 
      } 
     } 
    } 
} 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert(msg + ';' + url + ';' + num); 
    return true; 
}); 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert('and again ' + msg + ';' + url + ';' + num); 
    return true; 
}); 
</script> 

Quanto sopra consente di allegare quanti più onerror gestori come si desidera. Se esiste già un gestore personalizzato onerror esistente, invocherà quello, quindi il tuo.

noti che addHandler() può essere utilizzato per legare più gestori a qualsiasi evento:

addHandler(window, 'onload', function() { alert('one'); }); 
addHandler(window, 'onload', function() { alert('two'); }); 
addHandler(window, 'onload', function() { alert('three'); }); 

Questo codice è nuova e un po 'sperimentale. Io non sono sicuro al 100% addEventListener fa esattamente ciò che l'allegato manuale fa, e come ha commentato, attachEvent incendi gli handler nell'ordine inverso sono stati attaccati in (così si vedrebbe 'tre, due, uno' nell'esempio di cui sopra). Anche se non necessariamente "sbagliato" o "errato", è l'opposto di quello che fa l'altro codice in addHandler e, di conseguenza, potrebbe comportare un comportamento incoerente dal browser al browser, motivo per cui l'ho rimosso.

EDIT:

Questo è un banco di prova completo per dimostrare l'evento onerror:

<html> 
<head> 
<title>Title</title> 
</head> 
<body> 
<script type="text/javascript"> 
function addHandler(obj, evnt, handler) { 
    if (obj.addEventListener) { 
     obj.addEventListener(evnt.replace(/^on/, ''), handler, false); 
    } else { 
     if (obj[evnt]) { 
      var origHandler = obj[evnt]; 
      obj[evnt] = function(evt) { 
       origHandler(evt); 
       handler(evt); 
      } 
     } else { 
      obj[evnt] = function(evt) { 
       handler(evt); 
      } 
     } 
    } 
} 
addHandler(window, 'onerror', function (msg, url, num) { 
    alert(msg + ';' + url + ';' + num); 
    return true; 
}); 
</script> 
<div> 
...content... 
</div> 
<script type="text/javascript"> 
blah; 
</script> 
</body> 
</html> 

Quando il codice di cui sopra è messo in Test.htm e caricato in Internet Explorer dal idks locali, è dovrebbe vedere una finestra di dialogo che dice 'blah' is undefined;undefined;undefined.

Quando il codice di cui sopra è messo in Test.htm e caricato in Firefox 3.0.11 (e l'ultima 3.5 a partire da questa modifica - Gecko/20090616) dal disco locale, dovresti vedere una finestra di dialogo che dice [object Event];undefined;undefined. Se ciò non accade, la tua copia di Firefox non è configurata correttamente o altrimenti non funzionante. Tutto quello che posso suggerire è che tu rimuovi Firefox, rimuovi i tuoi profili locali (le informazioni su come trovare il tuo profilo sono disponibili here) e reinstallano la versione più recente e testano nuovamente.

+0

L'istruzione if è ciò che viene attivato sugli eventi che desidero vengano gestiti dal mio registratore di errori in Firefox. Qual è la rilevanza di addEventListener che viene creata in quella istruzione if? –

+0

L'unica cosa che succede con questo è che ogni volta che apro Firefox, qualsiasi cosa venga inserita nell'istruzione "if" si attiva. Non è una reazione al mio errore però. –

+0

addHandler() è un modo generico per aggiungere più funzioni di gestore a un evento. If (obj.addEventListener) verifica se il browser supporta il metodo addEventListener() sull'oggetto, se lo fa, aggiunge un gestore utilizzando il metodo supportato dal browser integrato. Se il browser non supporta il metodo addEventListener(), incatena il nuovo gestore dietro l'ultimo gestore aggiunto. –

7

Ricordarsi di restituire true da qualsiasi gestore personalizzato window.onerror o firefox lo gestirà comunque.

2

Sembra che vi sia un errore aperto (# 3982) in jQuery 1.3.x - jQuery.error event gets incorrect arguments. L'ultimo aggiornamento è stato 2 mesi fa con il commento:

Dato come pazzi l'evento di errore è, e con quale frequenza viene usato, sono d'accordo che è più facile da rimuovere il supporto per esso. Ho già aggiunto una nota ai documenti poiché non funzionava comunque.

immagino vorrei solo impostare window.onerror me stesso, simile a quello che di Grant pubblicato. Inoltre, FireFox: addEventListener Vs. window.onerror menziona che "element.addEventListener", causando un errore non attiva "window.onerror".

Problemi correlati