Verhindert, dass Javascript angehalten wird, wenn ein Fehler auftritt
Lesezeit: 6 Minuten
Unser Produkt fügt ein Skript in die Websites des Kunden ein, ähnlich wie eine Live-Chat-Box.
Oft haben die Websites von Kunden fehlerhaftes Javascript, das auch unseren Code stoppt (der Browser stoppt die Ausführung, wenn Fehler auftreten). Gibt es eine Möglichkeit, unseren Code trotzdem auszuführen, obwohl es Fehler in der Konsole zu Dingen wie undefinierten Methoden oder Variablen gibt?
Vielen Dank für Ihre Hilfe.
Theoretisch nicht, es sei denn, Sie führen Ihr Skript vor allem anderen auf der Seite aus (was normalerweise nicht möglich oder sogar wünschenswert ist).
– Chris Tonkinson
31. Mai 2012 um 0:25 Uhr
So ähnlich wie wenn der Flugzeugmotor ausfällt, gibt es keine Möglichkeit, ihn einfach weiterlaufen zu lassen
– CD Smith
31. Mai 2012 um 0:25 Uhr
Ich denke nicht, dass Sie Kundenseiten babysitten sollten. Wenn ihre Seiten fehlerhaft sind, ist es ihr eigenes Problem. Es würde sie auch dazu motivieren, den Code tatsächlich zu reparieren, anstatt eine Problemumgehung nach der anderen hinzuzufügen.
– Fabrício Matté
31. Mai 2012 um 0:27 Uhr
@AlfalfaStrange schließen, aber dies ist weniger mit einem allgemeinen Versagen vergleichbar als mit einer tatsächlichen Explosion. 🙂 +1
– Chris Tonkinson
31. Mai 2012 um 0:27 Uhr
@D3mon-1stVFW: Meinst du das ernst? Ein Applet? Wir haben 2012, nicht 2000. Aber verschwenden Sie keine Zeit damit, Ihre Sachen auf kaputten Seiten zum Laufen zu bringen. Wenn sie es wollen, sollen sie ihre Sachen reparieren.
– Meister der Diebe
31. Mai 2012 um 0:51 Uhr
Chris Tonkinson
Die kurze Antwort ist, dass Sie es wirklich nicht können.
“Lösung” #1: Sie könnten darauf bestehen, dass IHR Code von Drittanbietern vor dem Code aller anderen ausgeführt wird. In den meisten Fällen ist dies nicht möglich oder sogar wünschenswert.
“Lösung” #2: Sie könnten darauf bestehen, dass die 1st-Party-Ingenieure den gesamten 3rd-Party-Code einpacken try/catch Blöcke. Aber diese Lösung kauft Ihnen wirklich keine Garantie, weil sehr häufig Bibliotheken von Drittanbietern zusätzliche hinzufügen <script> Tags auf der Seite – diese würden nicht unter die “Gerichtsbarkeit” der fallen try/catch Gültigkeitsbereich, der den Code umschließt, der dieses/diese Tag(s) erstellt hat.
“Lösung” #3: Sie könnten IHRE App vollständig im Rahmen einer erstellen <iframe>, wodurch das Problem vollständig vermieden wird. Selbst wenn Sie sehr schlau sind, werden Sie leider schnell auf domänenübergreifende Verstöße, Cookie-Einschränkungen von Drittanbietern und dergleichen stoßen. Es ist sehr wahrscheinlich, dass dies bei Ihnen nicht funktioniert.
„Lösung“ Nr. 4: Sie könnten Ihrem Kunden das Problem erklären und verlangen, dass der andere Drittanbietercode sauber ausgeführt wird. Ich sage, dies ist eine “Lösung”, weil es ehrlich gesagt keine “Lösung” für Ihre Frage ist, wenn Ihre Frage eine ist wie man genau das vermeidet.
Leider ist Option Nr. 4 die beste Wahl. Es kann hilfreich sein, wenn Sie beobachten, dass andere Bibliotheken von Drittanbietern auf die gleiche Weise „kaputt“ gehen: Sie können Ihrem Kunden sagen: „Hey, das liegt nicht nur an mir – X, Y und Z sind alle ebenfalls „kaputt“ wegen .” Es kann dazu führen, dass sie den anstößigen Code unter Druck setzen, was das Web zu einem glücklicheren Ort für alle Beteiligten macht.
Also packen Sie die Funktionen in eine ‘Schließung’ wie $(function() { function myLibraryFunction() {...} } wird nicht helfen und die Codeausführung isolieren, wie es die Funktionsnamen und Variablen isoliert?
– Chloe
16. Oktober 2017 um 15:21 Uhr
Nicht erfasste Fehler, die in einem Skript ausgelöst werden (<script></script>) sollte nur dieses Skript abbrechen und keine anderen Skripts auf der Seite. Selbst dann könnte es möglicherweise eine Wiederherstellung/einen erneuten Versuch geben … zum Beispiel, wenn a setTimeout aufgerufen wurde, bevor der nicht abgefangene Fehler auftrat, der es ermöglichte, den Status zu überprüfen, neu zu starten, es erneut zu versuchen usw. Fehler beim Abfangen/Behandeln von Fehlern für verschiedene Skripte von Drittanbietern waren nicht gut, da das Tag-Management für das Laden verantwortlich war.
– mattpr
12. September 2022 um 13:24 Uhr
Jason Kulatunga
Wie andere gesagt haben, ist es vielleicht nicht das Beste, nach einem Fehler fortzufahren, aber Sie können Folgendes versuchen:
function ignoreerror()
{
return true
}
window.onerror=ignoreerror();
Das onerror-Ereignis wird immer dann ausgelöst, wenn ein JavaScript-Fehler auftritt (je nach Konfiguration Ihres Browsers wird möglicherweise ein Fehlerdialog angezeigt). Das onerror-Ereignis ist an das window-Objekt angehängt, ein ziemlich ungewöhnlicher Ort, an den man sich zurückziehen kann, aber aus gutem Grund. Es wird auf diese Weise angehängt, damit es alle JavaScript-Fehler auf einer Seite überwachen kann, sogar die im Abschnitt der Seite.
Browsers supporting window.onerror
Chrome 13+
Firefox 6.0+
Internet Explorer 5.5+
Opera 11.60+
Safari 5.1+
Beachten Sie die MDN-Dokumentation: “Beachten Sie, dass einige/viele Fehlerereignisse nicht window.onerror auslösen, Sie müssen speziell darauf lauschen.” (developer.mozilla.org/en/DOM/window.onerror)
– Chris Tonkinson
31. Mai 2012 um 1:24 Uhr
Ich habe festgestellt, dass window.onerror immer noch dazu führt, dass der Code nicht mehr ausgeführt wird. Alles, was true zurückzugeben scheint, ist zu unterdrücken, dass die Ausnahme in der Konsole erscheint. Der folgende Code (getestet in Chrome 42 und IE 10) veranschaulicht meinen Standpunkt: window.onerror = function(){return true;}; var s = “”; s.push(“H”); alarm(“test”); Der Fehler wird unterdrückt, aber der Alarmcode wird nie erreicht.
– Scott Marcus
3. September 2015 um 18:57 Uhr
Verwenden onerrorreturn true; oder addEventListener.preventDefault() verhindert nur die Anmeldung an der Konsole. Ein nicht abgefangener Fehler bricht immer das CURRENT SCRIPT ab. Der Schlüssel besteht darin, Ihren Code in einen separaten Skript-BLOCK (z <script></script>). Das Problem ist wahrscheinlich, dass ihr Code von einem einzelnen “Tag-Management” -Skript geladen wird, das selbst fehlerhaft ist oder Fehler für geladene Skripte nicht isoliert. Wenn also ein Fehler auftritt, wird er nicht behandelt und sie erhalten ihn nicht Gelegenheit zum Laden.
– mattpr
12. September 2022 um 13:19 Uhr
Sie können nicht von Ihrem Code aus – sie müssen verwendet werden try/catch für fragwürdige Schriftstücke.
Shaz
Sie könnten sie eine einfügen lassen iframe in ihre Seite, anstatt dass Sie versuchen, Code mit a einzufügen script Tag so: http://jsfiddle.net/EzMGD/ Beachten Sie, wie das Skript einen Fehler auslöst, aber wir können den Inhalt immer noch im Iframe sehen. Der Iframe sollte dabei helfen, gegebenenfalls die Variablen des anderen zu verwenden.
Theoretisch nicht, es sei denn, Sie führen Ihr Skript vor allem anderen auf der Seite aus (was normalerweise nicht möglich oder sogar wünschenswert ist).
– Chris Tonkinson
31. Mai 2012 um 0:25 Uhr
So ähnlich wie wenn der Flugzeugmotor ausfällt, gibt es keine Möglichkeit, ihn einfach weiterlaufen zu lassen
– CD Smith
31. Mai 2012 um 0:25 Uhr
Ich denke nicht, dass Sie Kundenseiten babysitten sollten. Wenn ihre Seiten fehlerhaft sind, ist es ihr eigenes Problem. Es würde sie auch dazu motivieren, den Code tatsächlich zu reparieren, anstatt eine Problemumgehung nach der anderen hinzuzufügen.
– Fabrício Matté
31. Mai 2012 um 0:27 Uhr
@AlfalfaStrange schließen, aber dies ist weniger mit einem allgemeinen Versagen vergleichbar als mit einer tatsächlichen Explosion. 🙂 +1
– Chris Tonkinson
31. Mai 2012 um 0:27 Uhr
@D3mon-1stVFW: Meinst du das ernst? Ein Applet? Wir haben 2012, nicht 2000. Aber verschwenden Sie keine Zeit damit, Ihre Sachen auf kaputten Seiten zum Laufen zu bringen. Wenn sie es wollen, sollen sie ihre Sachen reparieren.
– Meister der Diebe
31. Mai 2012 um 0:51 Uhr