Nehmen wir an, ich habe versehentlich Folgendes geschrieben:
do { } while (true);
…und dann lief es. Abgesehen davon, dass Sie Ihren Browser beenden, gibt es eine Möglichkeit, die Ausführung von Javascript zu stoppen (das Äquivalent von Strg + Break in Basic oder Strg + C)?
Normalerweise fragt Ihr Browser nach etwa 30 Sekunden, ob Sie das lange laufende Skript stoppen möchten, aber das passiert nicht immer (wie ich gerade herausgefunden habe)!
FYI: Eine einfache Schleife wie diese: for (i=1; i > 0; ++i); führt zum Absturz meines Browsers (Firefox 3.5b4). Ich habe keine große Lust zu testen, ob es eines meiner Add-Ons ist. Ständig meinen Browser neu zu starten ist nicht meine Vorstellung von einem lustigen Montagabend.
Konnten Sie aus Neugier feststellen, was dazu geführt hat, dass Ihr Browser keine „Slow Script“-Warnung ausgegeben hat?
– Alex
25. Mai 2009 um 4:47 Uhr
keine Ahnung! (Diese 15-Zeichen-Beschränkung ist ärgerlich)
– Nickf
25. Mai 2009 um 4:59 Uhr
Gehört das zu SuperUser?
– Chetan
24. April 2011 um 19:42 Uhr
@Chetan: Es ist so ziemlich alles programmierbezogen …
– Nickf
24. April 2011 um 20:03 Uhr
Oh, ich habe dies als Frage zur Browsernutzung missverstanden und nicht zur Plugin-Entwicklung. Mein Fehler.
– Chetan
24. April 2011 um 20:45 Uhr
Aktualisierung 2018:
Wenn Sie in Chrome 67 die DevTools geöffnet haben (F12), können Sie die Endlosschleife beenden, ohne den gesamten Tab zu beenden:
Gehen Sie zum Quellen und klicken Sie auf „Skriptausführung anhalten“.
Halten Sie dieselbe Taste gedrückt und wählen Sie nun das Symbol „Stop“.
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
28. Mai 2019 um 19:30 Uhr
@TiggerToo – Sie müssen nicht zuerst die richtige Datei finden. Klicken Sie einfach auf die Pause-Schaltfläche, und der Browser stoppt dort, wo er hängen bleibt.
– Sphinxxx
26. Dezember 2019 um 21:07 Uhr
Das funktioniert nicht. F12 reagiert nicht. Beim manuellen Öffnen von devtools wird ein „leeres“ Fenster angezeigt. Nur Pause-Taste, kein Stopp, und es tut nichts. Es ist nur möglich, den Prozess zu beenden.
– Bryc
18. Juli um 13:51 Uhr
Ich verwende Chome-Version 45.0.2454.101
Klicken Sie in der oberen rechten Ecke im Hamburger-Menü auf Weitere Tools > Task-Manager und beenden Sie dann die Registerkarte von dort. Dies ist der Fall, wenn der Versuch, die Registerkarte zu schließen, fehlschlägt. Andernfalls tötet es ein einfaches ‘X’ auf der Registerkarte.
Eine Endlosschleife in einem Ajax-Callback führt dazu, dass das einfache X fehlschlägt, wenn Sie devtools geöffnet haben.
– masterX244
23. Februar 2017 um 8:37 Uhr
Alex
Zumindest mit Chrome können Sie möglicherweise den einzelnen Tab und nicht die gesamte Anwendung beenden.
Randolpho hat mich auch darüber informiert, dass IE8 eine ähnliche Funktionalität hat.
Können Sie näher erläutern, wie Sie einen einzelnen Tab töten können? Suchen wir nach der richtigen chrome.exe und beenden sie im Task-Manager?
– mellamokb
26. April 2011 um 1:30 Uhr
negativ, geht nicht! zumindest nicht auf Version 36.0.1985.125 für Linux
– Krake
11. Oktober 2014 um 4:56 Uhr
Bei mir hat es in Version 40.0.2214.115 (64-Bit) funktioniert, aber ich musste mehrere Sekunden warten. Diese Antwort wäre 10-mal so nützlich und abstimmbar, wenn sie diese Details enthalten würde.
– Michael Scheper
4. März 2015 um 4:24 Uhr
Ich fand, dass dies für mich funktionierte, aber wenn Sie Umschalt + Esc auf derselben Registerkarte drücken, auf der sich die Endlosschleife befindet, gibt Chrome Javascript die Möglichkeit, den Tastendruck / Tastendruck / Tastendruck zu verarbeiten, bevor entschieden wird, ob es etwas tun soll, da Ihr Javascript jedoch beschäftigt ist und Ereignisse nicht verarbeiten können, deaktivieren Sie tatsächlich alle Chrome-Verknüpfungen.
– Barack Gall
6. Juli 2016 um 22:29 Uhr
In Chrome öffne ich einen neuen Tab und doppelklicke auf den x Schaltfläche neben dem Registerkartennamen. Es scheint zu funktionieren, obwohl ich nicht sicher bin, warum der erste Klick nicht registriert wird.
– Radvylf-Programme
21. Mai 2019 um 0:49 Uhr
Rahmat Ali
Wenn Sie verwenden Chrom Sie können den nicht reagierenden Tab einfach beenden:
Wechseln Sie zu einem anderen Tab
Drücken Sie Wechsel + Esc öffnen Task-Manager von Chrome
Finden Sie Ihren Tab in der Liste (sollte der meiste Speicherverbraucher sein)
Klicken Prozess beenden
Wichtig: Das Navigieren zu einem anderen Tab ist wichtig, denn wenn Sie sich auf dem ursprünglichen Tab befinden, wird JavaScript den Browser dazu bringen, Ihren Tastendruck nicht zu verarbeiten und aufgrund seiner Endlosschleife nichts zu tun.
javascript:
while (true) alert("irritated and exhausted - yet?");
Dies wird “unendlich” gehen und ein internes Timeout NICHT erschöpfen, da das Skript die CPU-Zeit nicht schnell genug verbrauchen wird. In FF 11 garantiert dies, dass es keine “nicht reagierenden Skript”-Abbruchmöglichkeiten geben wird.
Das ordnungsgemäße Stoppen nur des anstößigen Skripts war in frühen Browserversionen möglich und trivial, indem manuell eingegriffen wurde, ohne den gesamten Browser zu krächzen und abzubrechen. Eine solche Kontrolle nicht zu haben, ist ein großer Konstruktionsfehler der Browser-Software. Unvernünftige Geschicklichkeit und Reflexe sind erforderlich, um die manuelle Motormechanik der in der Referenz beschriebenen “Lösungen” zu bewirken.
Vorbehalt: Es ist möglich, dass Skripte “unendlich” werden, ohne Zeitüberschreitung UND ohne Eingabeaufforderungen des Alarmtyps. Diese sind besonders schädlich und lästig. Grundsätzlich laufen die Skripte so langsam, dass die CPU-Zeitzykluszuteilung von sagen wir 20 Sekunden beträgt. über mehrere Minuten oder Stunden gestreckt wird oder … vor dem Timeout durch Aussetzen der Ausführung bis zur Wiederaufnahme durch einen Ereignisauslöser. Anstatt CPU-Zyklen zu timen, wäre es für Skripte weitaus besser, eine Zeitüberschreitung bei der realen Taktung vorzunehmen. (Ist Ihnen schon einmal aufgefallen, dass Sie ein Skript nicht abbrechen können, das versucht, Inhalte abzurufen – aber erfolglos –, um eine Seite zu erstellen? In FF werden sowohl die Adressleisten-Schaltflächen reload und cancel/stop sind deaktiviert, obwohl der Tab zumindest geschlossen werden kann.) Normales Javascript Timeout() und setInterval() Anrufe leiden nicht darunter und sind so konditioniert, dass sie während des Suspendierens durch manuelles Eingreifen “anständig” abgebrochen werden können.
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 i den zulässigen Höchstwert überschreitet.
Sowiut
Die meisten Browser haben eine „Langsame Skriptleistung“-Warnung, die erscheint, wenn ein außer Kontrolle geratenes Javascript sehr lange braucht, um ausgeführt zu werden. Dieser Warndialog bietet normalerweise die Option, das anstößige Skript zu beenden.
Hängt vom Browser ab. 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 einfach vollständig zu beenden.
11440600cookie-checkWie stoppt man eine Endlosschleife in Javascript?yes
Konnten Sie aus Neugier feststellen, was dazu geführt hat, dass Ihr Browser keine „Slow Script“-Warnung ausgegeben hat?
– Alex
25. Mai 2009 um 4:47 Uhr
keine Ahnung! (Diese 15-Zeichen-Beschränkung ist ärgerlich)
– Nickf
25. Mai 2009 um 4:59 Uhr
Gehört das zu SuperUser?
– Chetan
24. April 2011 um 19:42 Uhr
@Chetan: Es ist so ziemlich alles programmierbezogen …
– Nickf
24. April 2011 um 20:03 Uhr
Oh, ich habe dies als Frage zur Browsernutzung missverstanden und nicht zur Plugin-Entwicklung. Mein Fehler.
– Chetan
24. April 2011 um 20:45 Uhr