Cryptic "Script Error." Signalé en Javascript dans Chrome et Firefox



Answers

Une mise à jour pour ceux qui trébucheront dans cette question à l'avenir: Broofa a raison avec la réponse et il n'y a pas de solution pour cela.

Évidemment, d'autres sont tombés dans cette limite et quelques bugs demandant un correctif ont été enregistrés pour Firefox: Bug 69301 et pour WebKit: Bug 70574

Les bonnes nouvelles sont que le bug a été résolu pour Firefox avec la sortie de Firefox 13. Voici comment vous l'utilisez:

<script src="http://somremotesite.example/script.js" crossorigin>

crossorigin est équivalent à crossorigin=anonymous et demande au navigateur de faire une extraction CORS du script sans envoyer d'informations d'identification.

Vous devez vous assurer que le script est envoyé avec une valeur d'en-tête HTTP Access-Control-Allow-Origin qui correspond au domaine demandeur, par exemple,

Access-Control-Allow-Origin: http://myhomesite.example
Access-Control-Allow-Origin: *

sinon le navigateur annulera le chargement du script .

Pour Apache:

Header set Access-Control-Allow-Origin "*"

(Et voir les exemples CORS pour d' autres serveurs Web .)

Si vous envoyez des scripts en PHP:

header('Access-Control-Allow-Origin', 'http://myhomesite.example');

J'ai testé cela et cela fonctionne comme prévu. toutes les erreurs du script.js seront interceptées par le gestionnaire window.onerror avec les window.onerror message, du fichier et de la ligne.

Le bug WebKit n'a pas encore été corrigé, mais un correctif a été proposé (et utilise la même solution). Espérons que le correctif sera publié bientôt.

Plus d'infos sur CORS ici: http://enable-cors.org/

Question

J'ai un script qui détecte les erreurs Javascript sur mon site Web et les envoie à mon backend pour les signaler. Il signale la première erreur rencontrée, le numéro de ligne supposé et l'heure.

EDIT pour inclure doctype:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">

...

<script type="text/javascript">
//<![CDATA[
// for debugging javascript!
(function(window){
    window.onerror = function(msg, url, ln) {
        //transform errors
        if (typeof(msg) === 'object' && msg.srcElement && msg.target) {
            if(msg.srcElement == '[object HTMLScriptElement]' && msg.target == '[object HTMLScriptElement]'){
                msg = 'Error loading script';
            }else{
                msg = 'Event Error - target:' + msg.target + ' srcElement:' + msg.srcElement;
            }
        }

        msg = msg.toString();

        //ignore errors
        if(msg.indexOf("Location.toString") > -1){
            return;
        }
        if(msg.indexOf("Error loading script") > -1){
            return;
        }

        //report errors
        window.onerror = function(){};
        (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date());
    };
})(window);
//]]>
</script>

En raison de ce script, je suis parfaitement conscient des erreurs javascript qui se produisent sur mon site. L'un des plus grands délinquants est "Script Error". sur la ligne 0. dans Chrome 10+ et Firefox 3+. Cette erreur n'existe pas (ou peut être appelée quelque chose d'autre?) Dans Internet Explorer.

Correction (5/23/2013): Cette erreur "Script Error, Line 0" apparaît maintenant dans IE7 et éventuellement d'autres versions d'IE. Peut-être le résultat d'un correctif de sécurité IE récent car ce comportement n'existait pas auparavant.

Est-ce que quelqu'un a une idée de ce que cette erreur signifie ou de ce qui la cause? Il se produit sur environ 0,25% de mes pageloads globaux, et représente la moitié des erreurs signalées.




J'ai expérimenté

Erreur de script. ligne 0

des erreurs pendant un certain temps ont été signalées à notre serveur lorsque l'erreur s'est produite dans les navigateurs des clients. Hier pour la première fois (après avoir introduit "use strict"; dans notre javascript) j'ai été capable de répliquer ce problème dans Safari et Chrome sur Windows 7. Après avoir jeté notre code avec alert (), j'ai retrouvé cette erreur. une variable indéfinie! par exemple xx = 123;xx n'est pas défini avec une instruction var .

Safari a signalé cela comme

ReferenceError: le mode strict interdit la création implicite de la propriété globale 'xx'

dans Web Inspector, mais la fonction window.onerror détectait

Erreur de script. ligne 0







J'ai fait une correction pour résoudre ce problème.

J'ai créé Hermes.js qui est un système d'erreur de journal qui a eu le même problème.

Après avoir étudié un certain temps, j'ai fait un correctif qui peut vous aider avec la politique inter-domaine «Script Error» sur les scripts dans différents domaines.

J'ai appelé CORSET et vous pouvez le voir here comment cela fonctionne.




Je vais vous dire ce qui a été corrigé pour moi sur Safari (WebKit): Si je mets la routine de rappel JS sur la page , alors je reçois des informations complètes. Si je l'inclue dans un fichier .js via une balise, je reçois simplement l'erreur "Script error" (sans numéro de linge, etc.).

Peut-être que cela est lié à ce que Broofa a dit.

Anwyay, alors maintenant j'ai un petit rappel dans la page, puis le reste du fichier en dehors de la page.




En raison du% faible, vous pouvez supposer qu'ils ne sont pas des utilisateurs normaux. Probablement des utilisateurs avec des scripts d'utilisateurs, des bookmarklets ou même simplement de jouer avec la console sur votre site web. Avoir tout le HTML d'une page où cela arrive pourrait aider à tester cette théorie. Ainsi que l'erreur complète. Ça devrait te donner une url, est-ce toujours la même chose? La ligne est-elle vraiment 0 ou juste indéfinie?

Je ne pense pas que définir des valeurs par défaut dans vous onerror est une bonne idée et le 0 vient probablement de parseInt(ln || 0) quand l'erreur n'est pas vraiment sur la page (voir les exemples ci-dessus).

Ajouter un if pour voir si la ligne est connue dans le JavaScript pour ignorer ces erreurs (car elles ne proviennent probablement pas de votre propre code) ou dans le code côté serveur pour s'en occuper séparément serait, mieux, mieux .

=== EDIT === Allez à: http://www.xavierm02.net/AZE/ Installez le fichier user.js (je l'ai fait sur Chrome mais ça devrait aussi marcher sur Firefox). Puis ouvrez la page html sur le même navigateur. Il vous montrera l'erreur (j'ai seulement changé cette insteal de rapport au serveur, il l'écrit sur la page). Avec 0 comme numéro de ligne.






Links