it-swarm.dev

Ignora gli errori di sintassi javascript in una pagina e continua a eseguire lo script

Sviluppo plugin per WordPress. Utilizza alcuni jquery nel lato utente (temi) come un plugin jQuery. Il problema è che, quando c'è un errore javascript con altri plugin creati da altri autori, il javascript del mio plugin non riesce ad essere eseguito.

E la cosa peggiore è che la gente considera che c'è un errore grave con il mio plugin anche se funziona al 100% bene con la gestione degli errori di istruzioni condizionali. Ma in realtà è dovuto ad alcuni altri errori di sintassi javascript di altri WP autori di plugin/temi.

C'è un modo per continuare a eseguire il mio plugin JS ignorando altri errori JS. O posso avere suggerimenti per gestire questo problema ??

enter image description here

47

Provare :

window.onerror = function(){
   return true;
}

Questo è se puoi includerlo prima che lo script bugged sia stato eseguito.

22
Cosmin

Dovresti correggere il vecchio errore JavaScript perché potrebbe creare molti problemi, non per ora ma per la prossima volta.

Metti il ​​tuo codice/codice JavaScript in alto (prima che JS abbia un errore) e chiamalo prima che JavaScript venga eseguito da un altro codice JavaScript.

Nel caso in cui sia necessario gestire l'eccezione JavaScript in fase di esecuzione, l'opzione migliore è

try { /* run js code */ } 
    catch (error){ /* resolve the issue or bug */ }
8
Krishna Kumar

Dovresti essere in grado di ingoiare qualsiasi errore utilizzando l'evento error:

$(window).error(function(e){
    e.preventDefault();
});

Non ho mai provato questo, ma dovrebbe funzionare in teoria.

Va notato che questa probabilmente non è una grande soluzione al tuo problema. Potrebbe essere che il tuo plugin interferisca con altri plugin. È, naturalmente, possibile che gli errori non siano colpa tua, ma in generale (con plugin pubblicamente rilasciati) non è il caso.

4
Shmiddty

Ho riscontrato lo stesso problema: ci sono un sacco di plugin che fanno troppe supposizioni e causano errori JavaScript nella tua pagina, anche quando sei un buon cittadino; questi errori non hanno nulla a che fare con il tuo plugin.

Non ha senso cercare di gestire gli errori negli altri plug-in - IMO è meglio essere autonomi ma resistenti ai loro errori.

Nel mio caso, gli errori stavano bloccando l'evento DOM pronto per jquery e il mio codice JavaScript JavaScript non veniva eseguito. La forma esatta dell'errore non è importante però - la soluzione è solo per sparare su più eventi.

La soluzione per me era avere dei fallback oltre a fare affidamento sull'evento ready di jQuery DOM:

  1. Ho avvolto qualsiasi codice che volevo attivare nell'evento DOM ready nella propria funzione, ad es. my_hardened_init_action ();
  2. Ho aggiunto una funzione, my_hardened_init (), che viene eseguita solo una volta. Chiama my_hardened_init_action () la prima volta che viene chiamato e non esegue nulla nelle chiamate successive.
  3. Ho aggiunto vari metodi per chiamare my_hardened_init () nel piè di pagina di WordPress. Nel mio caso, ne avevo solo bisogno due. Innanzitutto, provando il solito jQuery DOM init, ma tornando a un semplice setTimeout (). Pertanto, se jQuery DOM init non viene mai attivato a causa di un JavaScript non funzionante, il timeout verrà attivato poco dopo il completamento del caricamento della pagina.

Potresti aggiungere molti altri fallback, aggiungendo anche il codice all'intestazione, se necessario. Poiché my_hardened_init () viene eseguito solo una volta, puoi provare tutte le volte che vuoi per attivarlo.

Questo ha funzionato su un gruppo di siti client con una serie di altri plugin non funzionanti.

Spero che questo ti aiuti.

4
Jhong
2
ScottE

Se la pagina è in esecuzione. Uso:

$(window).error(function(e){
        e.preventDefault();
});  // IGNORE ALL ERROR JQUERY!

o usare:

window.onerror = function(){
   return true;
}  // IGNORE ALL ERROR JAVASCRIPT!
1
<script>
var _z = console;
Object.defineProperty(window, 'console', {
    get: function(){
        if (_z._commandLineAPI) {
         return true;   
        }
        return _z;
    },
    set: function(val) {
        _z = val;
    }
});
</script>
1

Metti la tua chiamata in plug-in 

try{
  ......
}
catch(e){

}
0
Rahul

Forse potresti provare a inserire il tuo js in un oggetto html, in modo che venga eseguito in una pagina separata. Questo probabilmente non sarà di grande aiuto se il js nella pagina principale non verrà eseguito per interagire con l'oggetto. Solo qualcosa con cui giocare.

0
Ian Wizard

Questo ha funzionato per me:

try{
    //your code
}
catch(error)
{
    return true;
}
0
Enginerd Sunio

Una dichiarazione di cattura regolare non funzionerà per questi tipi di errori. 

Possibili soluzioni alternative:

Usa inline-css per spostare la barra a sinistra invece di jQuery (non sono sicuro di quale sia la funzione completa del tuo plug-in, ma se fa semplicemente fluttuare la barra a sinistra perché non usare solo i CSS?)

Avere un iframe invisibile che tenta di eseguire un codice nella pagina padre. se fallisce, avvisa l'utente (da questo iframe) che non è stata colpa tua :)

0
codelove