web-dev-qa-db-fra.com

Ignorer les erreurs de syntaxe javascript dans une page et continuer à exécuter le script

Je développe des plugins pour WordPress. Il utilise un certain jquery du côté utilisateur (thèmes) comme plugin jquery . Le problème est que, quand il y a une erreur javascript avec d'autres plugins créés par d'autres auteurs, le javascript de mon plugin ne s'exécute pas.

Et le pire, c’est que les gens considèrent qu’il ya un problème grave avec mon plugin, même si cela fonctionne à 100% avec les instructions conditionnelles. Mais cela est en réalité dû à d'autres erreurs de syntaxe javascript d'autres auteurs de plug-in/thèmes WP.

Est-il possible de continuer à exécuter mon plugin JS en ignorant les autres erreurs JS. Ou puis-je avoir des suggestions pour résoudre ce problème?

enter image description here

47
Aakash Chakravarthy

Essayez:

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

C’est-à-dire si vous pouvez l’inclure avant l’exécution du script comportant un bogue.

22
Cosmin

Vous devez corriger l’ancienne erreur JavaScript car elle risque de créer de nombreux problèmes, non pas pour le moment, mais pour la prochaine fois.

Placez votre fichier/code JavaScript en haut (avant que JS n’ait une erreur) et appelez-le avant que JavaScript ne soit affecté par un autre code JavaScript.

Si vous avez besoin de gérer une exception JavaScript au moment de l'exécution, la meilleure option est

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

Vous devriez pouvoir avaler toute erreur en utilisant l'événement error:

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

Je n'ai jamais tenté cela, mais cela devrait fonctionner en théorie.

Il convient de noter que ce n'est probablement pas une bonne solution à votre problème. Il se peut que votre plugin interfère avec d'autres plugins. Il est bien sûr possible que les erreurs ne soient pas de votre faute, mais en général (avec les plugins publiés publiquement), ce n’est pas le cas.

4
Shmiddty

J'ai rencontré le même problème: il y a beaucoup de plugins qui font trop d'hypothèses et provoquent des erreurs JavaScript sur VOTRE page, même si vous êtes un bon citoyen; ces erreurs n'ont rien à voir avec votre plugin.

Il est inutile d'essayer de gérer les erreurs dans d'autres plugins - IMO, il est préférable d'être autonome mais résilient face à leurs erreurs.

Dans mon cas, les erreurs arrêtaient l’événement jQuery DOM ready et mon code d’initialisation JavaScript n’était pas exécuté. La forme exacte de l'erreur n'a cependant pas d'importance - la solution consiste simplement à déclencher plusieurs événements.

La solution pour moi était d’avoir des solutions de rechange en plus de compter sur l’événement jQuery DOM ready:

  1. J'ai incorporé le code que je voulais utiliser pour l'événement DOM ready dans sa propre fonction, par exemple. my_hardened_init_action ();
  2. J'ai ajouté une fonction, my_hardened_init (), qui ne s'exécute qu'une fois. Il appelle my_hardened_init_action () lors de son premier appel et ne fait rien pour les appels suivants.
  3. J'ai ajouté diverses méthodes pour appeler my_hardened_init () dans le pied de page WordPress. Dans mon cas, je n'avais besoin que de deux. Tout d'abord, essayez l'init DOM habituel jQuery, mais retombez dans un simple setTimeout (). Par conséquent, si le DOM init jQuery ne se déclenche jamais en raison d'un JavaScript défectueux, le délai d'attente se déclenche peu de temps après le chargement de la page.

Vous pouvez ajouter plusieurs autres solutions de repli, voire même ajouter le code à l'en-tête si besoin est. Comme my_hardened_init () ne s'exécute qu'une seule fois, vous pouvez essayer autant de fois que vous le souhaitez.

Cela a fonctionné sur un tas de sites clients avec une gamme d'autres plugins cassés.

J'espère que cela t'aides.

4
Jhong
2
ScottE

Si votre page est en cours d'exécution. Utilisation:

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

ou utiliser:

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

Mettez votre appel au plugin 

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

}
0
Rahul

Peut-être que vous pourriez essayer de placer votre js dans un objet html, de manière à ce qu'il soit exécuté dans une page séparée. Cela n'aidera probablement pas beaucoup si le js sur la page principale ne fonctionnera pas pour interagir avec l'objet. Juste quelque chose à jouer avec.

0
Ian Wizard

Cela a fonctionné pour moi:

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

Une instruction catch habituelle try ne fonctionnera pas pour ce type d'erreur. 

Solutions possibles:

Utilisez inline-css pour faire flotter la barre vers la gauche au lieu de jQuery (je ne suis pas sûr de la fonction complète de votre plugin, mais si elle fait simplement flotter la barre vers la gauche, pourquoi ne pas utiliser css?)

Avoir un iframe invisible qui essaie d'exécuter du code sur la page parente. s'il échoue, avertissez l'utilisateur (à l'intérieur de cette iframe) que ce n'est pas votre faute :)

0
codelove