Wie stoppt man eine Endlosschleife in Javascript?

76

Angenommen, ich habe dies versehentlich geschrieben:

 do { } while (true);

... und dann lief es. Gibt es neben dem Beenden Ihres Browsers eine Möglichkeit, die Ausführung von Javascript zu stoppen (entspricht Strg + Pause in Basic oder Strg + C)?

Normalerweise fragt Ihr Browser nach etwa 30 Sekunden, ob Sie das lang laufende Skript stoppen möchten, aber dies passiert nicht immer (wie ich gerade herausgefunden habe)!

Zu for (i=1; i > 0; ++i);Ihrer Information : Eine einfache Schleife wie diese führt dazu, dass mein Browser abstürzt (Firefox 3.5b4). Ich habe keine Lust zu testen, ob es eines meiner Add-Ons ist. Ein kontinuierlicher Neustart meines Browsers ist nicht meine Vorstellung von einem lustigen Montagabend.

nickf
quelle
Konnten Sie aus Neugier feststellen, warum Ihr Browser keine Warnung "Langsames Skript" ausgegeben hat?
Alex
2
keine Ahnung! (Diese Beschränkung auf 15 Zeichen ist ärgerlich)
Nickf
Gehört das in SuperUser?
Chetan
3
@Chetan: Es ist so ziemlich vollständig programmierbezogen ...
Nickf
Oh, ich habe dies eher als eine Frage zur Browsernutzung als zur Plugin-Entwicklung missverstanden. Mein Fehler.
Chetan

Antworten:

23

Zumindest mit Chrome können Sie möglicherweise die einzelne Registerkarte und nicht die gesamte Anwendung löschen.

Randolpho hat mich auch darüber informiert, dass IE8 ähnliche Funktionen hat.

Alex
quelle
3
Können Sie näher erläutern, wie Sie einen einzelnen Tab töten können? Suchen wir nach der richtigen chrome.exe und töten sie im Task-Manager?
Mellamokb
1
negativ, funktioniert nicht! Zumindest nicht auf Version 36.0.1985.125 für Linux
Octopus
2
Es funktionierte für mich in Version 40.0.2214.115 (64-Bit), aber ich musste einige Sekunden warten. Diese Antwort wäre 10 × so nützlich und abstimmbar, wenn sie diese Details enthalten würde.
Michael Scheper
1
Ich fand, dass dies für mich funktioniert hat, aber wenn Sie Shift + Esc in derselben Registerkarte drücken, in der sich die Endlosschleife befindet, gibt Chrome Javascript die Möglichkeit, den Tastendruck / Keydown / Keyup zu verarbeiten, bevor Sie entscheiden, ob etwas getan werden soll, da Ihr Javascript jedoch beschäftigt ist und Sie können keine Ereignisse verarbeiten, bei denen Sie tatsächlich alle Chrome-Verknüpfungen deaktivieren.
Barak Gall
In Chrome öffne ich eine neue Registerkarte und doppelklicke auf die xSchaltfläche neben dem Namen der Registerkarte. Es scheint zu funktionieren, obwohl ich nicht sicher bin, warum der erste Klick nicht registriert ist.
Redwolf Programme
58

Ich verwende Chome Version 45.0.2454.101

Klicken Sie oben rechts im Hamburger-Menü auf Weitere Tools> Task-Manager und beenden Sie die Registerkarte von dort aus. Dies ist der Fall, wenn der Versuch, die Registerkarte zu schließen, fehlschlägt. Andernfalls wird es durch ein einfaches "X" auf der Registerkarte beendet.

Sevin Lim
quelle
Eine Endlosschleife in einem Ajax-Rückruf führt dazu, dass das einfache X fehlschlägt, wenn Sie devtools geöffnet haben.
MasterX244
53

Update 2018:

Wenn Sie in Chrome 67 die DevTools geöffnet haben ( F12), können Sie die Endlosschleife beenden, ohne die gesamte Registerkarte zu beenden:

  • Gehen Sie zum Quellenbedienfeld und klicken Sie auf "Skriptausführung anhalten".
  • Halten Sie dieselbe Taste gedrückt und wählen Sie nun das Symbol "Stopp".

Geben Sie hier die Bildbeschreibung ein

https://developers.google.com/web/updates/2018/04/devtools#stop

Sphinxxx
quelle
Das hat bei mir nicht funktioniert, obwohl ich möglicherweise mit all dem Zeug in den Quellen einfach nicht die richtige Datei finden kann.
TiggerToo
@TiggerToo - Sie müssen nicht zuerst die richtige Datei finden. Klicken Sie einfach auf die Pause-Schaltfläche, und der Browser stoppt überall dort, wo er feststeckt.
Sphinxxx
10

ref: /superuser/92617/stop-never-ending-popup-alerts-in-firefox
Firefox ist besonders problematisch ...

Warnung! Vorbehalt! Führen Sie dies NICHT aus!

javascript:
    while (true) alert("irritated and exhausted - yet?");

Dies wird "unendlich" und erschöpft KEIN internes Timeout, da das Skript die CPU-Zeit nicht schnell genug verbraucht. In FF 11 garantiert dies, dass es keine Abtreibungsmöglichkeiten für nicht reagierende Skripte gibt.

In frühen Browserversionen war es möglich und trivial, nur das fehlerhafte Skript ordnungsgemäß zu stoppen, indem manuelle Eingriffe vorgenommen wurden, ohne den gesamten Browser zu quaken und abzubrechen. Eine solche Kontrolle nicht zu haben, ist ein großer Konstruktionsfehler der Browsersoftware. Unangemessene Geschicklichkeit und Reflex sind erforderlich, um die manuelle Motormechanik der in der Referenz beschriebenen "Lösungen" zu beeinflussen.

Vorsichtsmaßnahme: Es ist möglich, dass Skripte "unendlich" werden, ohne Zeitüberschreitung UND ohne Eingabeaufforderungen vom Typ "Alarm". Diese sind besonders schädlich und nervig. Grundsätzlich laufen die Skripte langsam genug, so dass der CPU-Zeitzyklus etwa 20 Sekunden beträgt. wird über mehrere Minuten oder Stunden ausgedehnt oder ... vor dem Timeout durch Aussetzen der Ausführung bis zur Wiederaufnahme eines Ereignisauslösers. Anstatt die CPU-Zyklen zeitlich zu steuern, ist es für Skripte weitaus besser, bei der realen Taktung eine Zeitüberschreitung zu erzielen. (Immer , wie Sie können nicht abbrechen ein Skript , das zum Abrufen von Inhalten versucht - aber erfolglos - für den Aufbau einer Seite In FF sowohl die Adressleiste Tasten reloadund cancel/stop. Deaktiviert werden , obwohl die Lasche zumindest geschlossen werden kann) Normal Javascript Timeout()undsetInterval() Anrufe leiden nicht darunter und sind so konditioniert, dass ein manueller Eingriff möglich ist, um sie "elegant" abzubrechen.

Testumgebung für empirische Beobachtungen:

window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0

PS. das Skript

for (i=1; i > 0; ++i);

wird schließlich bei einem Überlauffehler abgefangen, wenn ider maximal zulässige Wert überschritten wird.

geloopt
quelle
9

Wenn Sie Chrome verwenden, können Sie den nicht reagierenden Tab leicht töten.

Führen Sie die folgenden Schritte aus, wenn eine unendliche JavaScript-Schleife aufgetreten ist:

1.Wenn Sie bereits eine andere Registerkarte geöffnet haben, gehen Sie auf diese Registerkarte oder öffnen Sie eine neue

2. Drücken Sie "Umschalt + Esc", um den Task-Manager von Chrome zu öffnen

3.Finden Sie Ihre Registerkarte in der Liste (sollte sich mit dem meisten Speicherverbraucher in der Liste befinden) und klicken Sie auf die Schaltfläche "Prozess beenden".


Das Navigieren zu einer anderen Registerkarte ist wichtig, da JavaScript Ihren Tastendruck erfasst und aufgrund seiner Endlosschleife nichts dagegen unternimmt.

Rahmat Ali
quelle
4

Die meisten Browser haben eine Warnung "Langsame Skriptleistung", die angezeigt wird, wenn die Ausführung eines außer Kontrolle geratenen Javaskripts sehr lange dauert. Dieser Warndialog bietet normalerweise die Option, das fehlerhafte Skript zu beenden.

Soviut
quelle
5
-1 redundant. OP: "Normalerweise fragt Ihr Browser nach etwa 30 Sekunden, ob Sie das lang laufende Skript stoppen möchten, aber das passiert nicht immer (wie ich gerade herausgefunden habe)!" Ich habe das gleiche Problem auch festgestellt, da der Dialog nicht immer angezeigt wird.
Mellamokb
Unter stackoverflow.com/questions/905322/… finden Sie mögliche Gründe, warum "der Dialog nicht immer angezeigt wird".
user66001
4

Kommt auf den Browser an. Bei einigen können Sie auf die Schaltfläche "Stopp" klicken, um die Ausführung von Javascript zu stoppen. Andere nicht.

Ich schlage vor, der beste Weg ist, den Browser oder die Registerkarte vollständig zu beenden.

Randolpho
quelle
0

In den meisten anständigen Browsern wird eine Warnung angezeigt, dass das Skript nicht reagiert. Wenn nicht, sollten Sie am besten herausfinden, warum die Warnung nicht angezeigt wird.

jrharshath
quelle
0

Von /superuser/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617 , anonym :

Dies ist keine zufriedenstellende Allzwecklösung, aber mit Greasmonkey (oder möglicherweise Ubiquity oder Jetpack) können Sie window.alert mit einer Funktion überschreiben, die window.confirm aufruft und optional einen Fehler auslöst, wodurch die gesamte Skriptausführung gestoppt wird, oder schaltet ein Flag um, um Warnungen zu stoppen. Dies kann nützlich sein, wenn eine Site, zu der Sie immer wieder zurückkehren, dieses Verhalten aufweist.

user66001
quelle
0

Wenn ich Chrome verwende und dies passiert, drücke ich Shift + Strg + Esc, um den Windows-Taskmanager aufzurufen. Wechseln Sie dann zur Registerkarte "Prozesse" und scrollen Sie durch die Prozesse "chrome.exe" (Chrome hat einen Prozess für jede geöffnete Registerkarte), bis ich einen mit einer deutlich höheren CPU-Auslastung als die anderen finde. Es hat ungefähr 30% für mich, während alle anderen 0-2% haben. Dann werde ich diesen Prozess einfach beenden. Das Gleiche können Sie tun, indem Sie unter tools> taskmanager oder shift + esc in Chrome den benutzerdefinierten Taskmanager für seine Prozesse öffnen. Dies könnte einfacher zu verwenden sein, da mehr Informationen zu den Registerkarten angezeigt werden.

Clox
quelle