Ich habe ein Skript, das Javascript-Fehler auf meiner Website erkennt und zur Berichterstellung an mein Backend sendet. Es werden der erste aufgetretene Fehler, die vermutete Zeilennummer und die Uhrzeit gemeldet.
BEARBEITEN, um doctype einzuschließen:
<!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>
Aufgrund dieses Skripts sind mir alle Javascript-Fehler, die auf meiner Website auftreten, sehr bewusst. Einer der größten Straftäter ist "Script Error". in Zeile 0. in Chrome 10+ und Firefox 3+. Dieser Fehler ist im Internet Explorer nicht vorhanden (oder kann als etwas anderes bezeichnet werden?).
Korrektur (23.05.2013): Dieser Fehler " Skriptfehler , Zeile 0" wird jetzt in IE7 und möglicherweise in anderen Versionen von IE angezeigt. Möglicherweise ein Ergebnis eines kürzlich durchgeführten IE-Sicherheitspatches, da dieses Verhalten zuvor nicht vorhanden war.
Hat jemand eine Idee, was dieser Fehler bedeutet oder was ihn verursacht? Es passiert bei ungefähr 0,25% meiner gesamten Seitenladungen und repräsentiert die Hälfte der gemeldeten Fehler.
quelle
application/xhtml+xml
, um sie im XHTML-Parser auszuführen (wie in der XHTML-Spezifikation angegeben). Es gibt eine ganze Menge Inhalte, die behaupten, XHTML zu sein, aber normalen HTML-Doctype senden. Aufgrund der falschen Verwendung von XHTML durch Inhaltsersteller haben Browser beschlossen, nur XML-Parser zu verwendenapplication/xhtml+xml
(es ist ein wirklich strenger Parser). In hixie.ch/advocacy/xhtml und webdevout.net/articles/beware-of-xhtml wird angegeben , warum nicht HTML-Parser mit XHTML verwendet werden soll.Antworten:
Der "Skriptfehler". tritt in Firefox, Safari und Chrome auf, wenn eine Ausnahme gegen die Richtlinie des Browsers mit demselben Ursprung verstößt, dh wenn der Fehler in einem Skript auftritt, das in einer anderen Domäne als der Domäne der aktuellen Seite gehostet wird.
Dieses Verhalten soll verhindern, dass Skripte Informationen an externe Domänen weitergeben. Als Beispiel dafür, warum dies notwendig ist, stellen Sie sich einen versehentlichen Besuch vor
evilsite.com
, der eine Seite mit dient<script src="yourbank.com/index.html">
. (Ja, wir zeigen dieses Skript-Tag auf HTML, nicht auf JS). Dies führt zu einem Skriptfehler, der jedoch interessant ist, da er uns mitteilen kann, ob Sie angemeldet sind oder nicht. Wenn Sie angemeldet sind, liegt der Fehler möglicherweise vor'Welcome Fred...' is undefined
, wenn dies nicht der Fall ist'Please Login ...' is undefined
. Etwas in diese Richtung.Wenn evilsite.com dies für die rund 20 besten Bankinstitute tut, haben sie eine ziemlich gute Vorstellung davon, welche Bankenseiten Sie besuchen, und könnten eine viel gezieltere Phishing-Seite bereitstellen. (Dies ist natürlich nur ein Beispiel. Es zeigt jedoch, warum Browser nicht zulassen sollten, dass Daten Domänengrenzen überschreiten.)
Ich habe dies in den neuesten Versionen von Safari, Chrome und Firefox getestet - alle tun dies. IE9 tut dies nicht - es behandelt Ausnahmen mit x Ursprung genauso wie Ausnahmen mit gleichem Ursprung. (Und Opera unterstützt keinen Fehler.)
Aus dem Maul des Pferdes: WebKit-Quelle, die die Herkunft überprüft, wenn Ausnahmen an onerror () übergeben werden. Und die Firefox-Quelle, die dies überprüft .
UPDATE (21.10.11) : Der Firefox-Fehler, der dieses Problem verfolgt, enthält einen Link zu dem Blog-Beitrag, der dieses Verhalten inspiriert hat.
UPDATE (02.12.14) : Sie können jetzt die vollständige domänenübergreifende Fehlerberichterstattung in einigen Browsern aktivieren, indem Sie ein
crossorigin
Attribut für Skript-Tags angeben und den Server die entsprechenden CORS- HTTP- Antwortheader senden lassen .quelle
Script Error.
auch auftritt, wenn der Benutzer eine Safari-Erweiterung installiert hat (wahrscheinlich die gleiche für Firefox-Plug-Ins), die fehlerhaften JavaScript-Code einfügtEin Update für diejenigen, die in Zukunft auf diese Frage stoßen werden: broofa hat Recht mit der Antwort und es gibt keine Problemumgehung dafür.
Offensichtlich sind andere auf diese Einschränkung gestoßen, und einige Fehler, die eine Korrektur anforderten, wurden für Firefox: Bug 69301 und für WebKit: Bug 70574 eingereicht
Die gute Nachricht ist, dass der Fehler für Firefox mit der Veröffentlichung von Firefox 13 behoben wurde. So verwenden Sie ihn:
crossorigin
entsprichtcrossorigin=anonymous
und weist den Browser an , einen CORS-Abruf des Skripts durchzuführen, ohne Anmeldeinformationen zu senden.Sie müssen sicherstellen, dass das Skript mit einem
Access-Control-Allow-Origin
HTTP-Headerwert gesendet wird, der der anfordernden Domäne entspricht, z.Andernfalls bricht der Browser das Laden des Skripts ab .
Für Apache:
(Siehe CORS-Beispiele für andere Webserver .)
Wenn Sie Skripte in PHP senden:
Ich habe dies getestet und es funktioniert wie erwartet. Alle Fehler aus der Datei script.js werden vom
window.onerror
Handler mit Nachrichten-, Datei- und Zeilendetails abgefangen .Der WebKit-Fehler wurde noch nicht behoben, aber ein Patch wurde vorgeschlagen (und verwendet dieselbe Lösung). Hoffentlich wird das Update bald veröffentlicht.
Weitere Informationen zu CORS finden Sie hier: http://enable-cors.org/
quelle
Dieser brauchte ziemlich viel, um herauszufinden.
Wir haben eine Reihe von Dingen unternommen, um zu versuchen, das Problem zu lösen, einschließlich der Rückspeisung des GANZEN Dokumentkörpers über Ajax auf unsere Server, um dies herauszufinden.
Ich bin mir immer noch nicht sicher, was "Skriptfehler" verursacht. (mit dem Zeitraum BTW wird dies in unserem Ajax-Logger angezeigt) in Firefox, aber in Chrome konnten wir es auf ...
Trommelwirbel...
Die automatische Übersetzungsfunktion von Google Chrome.
Viele englischsprachige Menschen wissen wahrscheinlich nicht einmal über diese Funktion Bescheid, aber um sie zu testen, besuchen Sie vermutlich eine nicht englischsprachige Website mit Chrome. Oder noch besser, wenn Sie die Chrome-Optionen durchgehen, können Sie die Browsersprache ändern. Ändern Sie es in etwas Nicht-Englisches, starten Sie den Browser neu und besuchen Sie eine englische Site.
In der oberen Leiste wird gefragt, ob Chrome die Seite für Sie übersetzen soll.
In unserem Fall hat der Übersetzer das Problem sowieso verursacht, da er ein Skript-Tag in Ihren Dokumententext einfügt und (hier erraten) ein JS-basiertes System verwendet, um den Inhalt an die Server von Google zu senden und ihn zum Übersetzen zu bewegen.
Obwohl der Fehler in der Konsole nicht referenziert war, lautete die Nachricht, die an window.onerror gesendet wurde, "Skriptfehler".
Wie auch immer, es gibt eine Heilung.
http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html
Dies wird zwei Dinge bewirken (soweit wir wissen, vielleicht mehr?):
a) Deaktivieren Sie, dass die Übersetzungsleiste in Chrome angezeigt wird.
b) Deaktivieren Sie die Übersetzung der Seite über translate.google.com.
In unserer Situation löste dies sowieso eine TONNE dieser "Skriptfehler". Probleme, die wir hatten.
Entschuldigen Sie die Rechtschreibfehler in diesem Beitrag, ich bin immer noch in einem nicht-englischen Modus in Chrome und schreibe dies, und die Rechtschreibprüfung ist nicht auf Englisch eingestellt;) Zeit zum Zurückschalten.
Genießen!
quelle
onerror
(zumindest in Firefox) in einem solchen Fall nur "Skriptfehler" anzeigt.Aufgrund des niedrigen Prozentsatzes können Sie davon ausgehen, dass es sich nicht um normale Benutzer handelt. Wahrscheinlich Benutzer mit Benutzer-Skripten, Lesezeichen oder sogar nur mit der Konsole auf Ihrer Website herumspielen. Wenn Sie den gesamten HTML-Code einer Seite haben, auf der dies geschieht, können Sie diese Theorie besser testen. Sowie der komplette Fehler. Es sollte dir eine URL geben, ist es immer das gleiche? Ist die Zeile wirklich 0 oder nur undefiniert?
Ich denke nicht, dass es eine gute Idee ist, Standardwerte in Ihrem
parseInt(ln || 0)
Fehler festzulegen, und die 0 kommt wahrscheinlich von, wenn der Fehler nicht wirklich auf der Seite ist (siehe Beispiele oben).Das Hinzufügen eines if, um festzustellen, ob die Zeile entweder im JavaScript bekannt ist, um diese Fehler zu ignorieren (da sie wahrscheinlich nicht aus Ihrem eigenen Code stammen) oder im serverseitigen Code, um sie separat zu behandeln, wäre imo besser .
=== BEARBEITEN === Gehe zu: http://www.xavierm02.net/AZE/ Installiere die Datei user.js (ich habe es in Chrome gemacht, aber es sollte auch in Firefox funktionieren). Öffnen Sie dann die HTML-Seite im selben Browser. Es zeigt Ihnen den Fehler (ich habe nur diesen Insteal der Berichterstattung an den Server geändert, er schreibt ihn auf die Seite). Mit 0 als Zeilennummer.
quelle
(new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url) + "&ln=" + parseInt(ln) + "&r=" + (+new Date());
und Sie sehen wahrscheinlich keine URL (da es sich um eine Erweiterung oder etwas Lokales handelt, sodass der Browser Sie nicht anzeigt) und keine Zeilennummer.Ich hatte ein ähnliches Problem: Meine Skripte werden von einer Subdomain bereitgestellt und unterliegen derselben Ursprungsbeschränkung. Ich habe dies jedoch gelöst durch:
1) Hinzufügen jedes Skript-Tags wie folgt:
2) Ändern Sie die Apache httpd.conf, indem Sie in jedem vhost Folgendes hinzufügen (Sie müssen mod_headers aktivieren):
Hoffe das hilft ...
BEARBEITEN
Auf einem meiner Server konnte ich dies nur durch Ersetzen funktionsfähig machen
durch
Seien Sie sich der Mängel bewusst, die möglicherweise * das Phishing erweiterter Informationen ermöglichen. Eine Dokumentation zu CORS, Same-Origin, Img & Fonts, CDN ist verfügbar, es sind jedoch nur sehr wenige Details zu Crossorigin-Details für Skript-Tags verfügbar.
quelle
In Chrome wird beim Laden von HTML und Javascript auch "Skriptfehler" (in Zeile 0) angezeigt
file://
. Dies passiert in Firefox nicht. Wahrscheinlich übereifriger Schutz von Chrome gleichen Ursprungs.Alles ist gut, wenn Sie das gleiche HTML und Javascript über HTTP laden.
quelle
Wie wäre es mit dem unten. Der Skriptfehler ist nicht über JavaScript verfügbar. Isolieren Sie also einfach diesen speziellen Fall und behandeln Sie ihn so gut wie möglich.
quelle
Ein guter Artikel, der endlich auf diesen Thread verweist. https://danlimerick.wordpress.com/2014/01/18/how-to-catch-javascript-errors-with-window-onerror-even-on-chrome-and-firefox/
quelle
Sowohl Chrome als auch Firefox unter iOS basieren auf der Safari-Webansicht, fügen jedoch eine Reihe von benutzerdefinierten Skripten in jede geladene Seite ein. Wenn in einem dieser Skripte etwas schief geht, wird es ebenfalls gemeldet
Script error on line 0
. (Vom Browser eingefügte Skripte gelten ebenfalls als Kreuzursprung)Wie ich in diesem anderen SO-Thread aufgespürt und dokumentiert habe, haben sowohl Chrome als auch Firefox unter iOS Probleme mit ihren benutzerdefinierten Skripten, die SVG-Elemente korrekt behandeln. Zusätzlich zu allen anderen Antworten in diesem Thread: Wenn Sie SVG-Elemente und
<a>
-Tags in<svg>
Tags auf Ihrer Seite verwenden, wird diesScript errors
in iOS Chrome und iOS Firefox gemeldet.quelle
Ich werde Ihnen sagen, was es für mich in Safari (WebKit) behoben hat: Wenn ich die JS-Rückrufroutine tatsächlich auf die Seite setze , erhalte ich vollständige Informationen. Wenn ich es über ein Tag in eine .js-Datei einbinde, erhalte ich nur den Fehler "Skriptfehler" (ohne Leinenzahl usw.).
Vielleicht hängt das damit zusammen, was Broofa gesagt hat.
Anwyay, also habe ich jetzt einen kleinen Rückruf auf der Seite und dann den Rest der Datei außerhalb der Seite.
quelle
Ich habe ein bisschen gesucht und es scheint, dass ein "Skriptfehler" bedeutet, dass es Probleme beim Laden einer Datei gab, nach der gesucht wurde. Dies kann ein Caching-Problem auf der Clientseite oder ein Serverproblem aufgrund von Überlastung sein.
Es wird höchstwahrscheinlich durch so etwas verursacht, bei dem das Skript selbst die Datei ist, die es nicht laden kann, daher der Fehler in Zeile 0.
quelle
script.onerror
wurde in einigen Browsern nicht wegen fehlender Skripte gefeuert.Ich habe erlebt
Skriptfehler. Zeile 0
Fehler, die für einige Zeit an unseren Server zurückgemeldet wurden, als der Fehler in Kundenbrowsern auftrat. Gestern zum ersten Mal (nach Einführung
"use strict";
in unser Javascript) konnte ich dieses Problem in Safari und Chrome unter Windows 7 replizieren. Nachdem ich unseren Code mit alert () -Anweisungen übersät hatte, führte ich diesen Fehler auf die Verwendung einer undefinierten Variablen zurück! zBxx = 123;
wo xx nicht mit einervar
Anweisung definiert ist .Safari meldete dies als
ReferenceError: Der strikte Modus verbietet die implizite Erstellung der globalen Eigenschaft 'xx'.
innerhalb von Web Inspector, aber die Funktion window.onerror wurde erkannt
Skriptfehler. Zeile 0
quelle
Das Durchsuchen des Firefox-Quellcodes zeigt, dass es keine gibt
"Script Error."
. Daher ist es sehr wahrscheinlich, dass ein Skript auf Ihrer Website einen nicht erfassten Fehler wie den folgenden auslöst:Wahrscheinlich wird diese Aussage nur in Firefox und Chrome erreicht.
Ich bin mir nicht sicher, warum es keine Zeilennummer gibt. Vielleicht ein
eval()
Problem?quelle