Ich verwende die innerHTML
-Eigenschaft, um dynamisch eine zu ändern, um über einen Prozess zu berichten, der ein paar Sekunden dauert, um zu beenden. Das Problem ist, dass in Firefox die Seite nicht wirklich neu gerendert wird, um diese Änderung widerzuspiegeln, bis das Skript beendet ist. Dies macht die App träge. Gibt es eine Möglichkeit sicherzustellen, dass Änderungen am HTML-Code sofort angezeigt werden, auch wenn mehr Skripts ausgeführt werden?Wie kann ich den Browser zwingen, neu zu zeichnen, während mein Skript eine schwere Verarbeitung durchführt?
8
A
Antwort
14
Der Browser ist single threaded. Während das Skript läuft, kann der Browser nichts anderes tun. Wenn Sie etwas wie eine Fortschrittsanzeige machen möchten, müssen Sie setTimeout()
oder setInterval()
verwenden und Ihre Aufgabe in kleinere Stücke zerlegen, die in einem Intervall ausgeführt werden. Dadurch bleiben Lücken zwischen den Skriptläufen bestehen, die dem Browser die Kontrolle zurückgeben, wo der Browser neu zeichnen kann.
6
Versuchen Sie, Ihr Skript regelmäßig zu unterbrechen. Sie sollten in der Lage sein
setTimeout(nextFunction, 0);
zu verwenden, um die notwendige Unterbrechung ohne lange Verzögerung zu schaffen, wo nextFunction die Funktion ist, die mit dem langen Verarbeitung fortgesetzt wird.
Verwandte Themen
- 1. Wie kann ich den Webbrowser zwingen, eine neu bereitgestellte Flash-Datei neu zu laden, ohne den Cache zu löschen?
- 2. Browser zwingen, index.htm neu zu laden
- 3. Wie kann ich mein Plugin zwingen, bei jeder Anfrage neu zu laden?
- 4. Wie kann ich Rails zwingen, application.js neu zu laden?
- 5. Wie kann ich mein Datenbankdesign zeichnen?
- 6. Was passiert, wenn ich mein Skript abrupt schließe, während es noch Datei-I/O-Vorgänge durchführt?
- 7. Wie können Sie den Browser zwingen, eine XML-Datei herunterzuladen?
- 8. wie jQuery UI Dialog zu zwingen, wieder neu zu zeichnen oder etwas auslösen zu zwingen, die Größe
- 9. Kann ich Pip zwingen, die aktuelle Version neu zu installieren?
- 10. OK, um in asynchronen Callbacks eine schwere Verarbeitung durchzuführen?
- 11. Wie kann ich window.location zwingen, eine HTTP-Anfrage zu stellen, anstatt den Cache zu benutzen?
- 12. Wie kann ich dem Browser während intensiver JavaScript-Verarbeitung die Kontrolle zurückgeben (kurz)?
- 13. VERARBEITUNG: Wie kann ich nur alle x Frames zeichnen?
- 14. Wie kann ich mein PHP-Skript testen?
- 15. Wie mache ich, um den Browser zu zwingen, die HTML-Formularfelddaten nicht zu speichern?
- 16. Browser zwingen eine große Datei herunterladen
- 17. Wie kann ich Unterklassen zwingen, eine Konstante in Java neu zu definieren?
- 18. Wie verhindere ich, dass der Browser teure DNS-Lookups durchführt?
- 19. Kann ich JavaFX's GridPane zwingen, den Raum gleichmäßig zu verteilen?
- 20. Wie man eine Masseneinfügung durchführt - Linq zu den Entitäten
- 21. Wie Speicherfehler zu bewältigen, während schwere CSV-Dateien
- 22. wie QProgressBar für schwere Berechnung zu implementieren?
- 23. Browser zwingen, neues CSS zu verwenden
- 24. Wie kann ich Liquibase zwingen, Prüfsummen neu zu berechnen, ohne die Anweisungen erneut auszuführen?
- 25. ROR: Wie kann ich die Parameter vom Controller bekommen, ohne den Browser neu zu laden?
- 26. Könnte eine Website den Browser zwingen, in den Vollbildmodus zu wechseln?
- 27. Wie kann ich Java's HttpClient zwingen, ungültige Cookies zu akzeptieren?
- 28. Wie kann ich eine Website zwingen, die neueste Version von CKEditor.js mit einem Userscript zu verwenden?
- 29. Wie kann ich den Browser neu laden und den aktuellen Status im AngularJS UI-Router beibehalten?
- 30. Sprite/PNG Grafik-schwere Seite, oh mein!
Es scheint nicht der Fall zu sein, dass der Browser single threaded ist. Es hat einen Javascript-Thread, aber es gibt einen parallelen Thread, der die Seite rendert und das DOM manipuliert. –
Das hängt wirklich davon ab, * welchem * Browser du sprichst. Einige mögen das jetzt tun, wie Chrome mit seinem Multiprozess-Modell - wo der Inhalt jedes Browsers ein separater Prozess ist und der Chrom auch auf seinem eigenen Prozess ist. aber Sie können immer noch jeden Browser mit 'while (1)' hängen. Wie viel von dem Browser hängt, hängt davon ab, wie der Browser aufgebaut ist. – Breton
Sie können den js-Thread aufhängen, indem Sie while (1) {} aufrufen, aber das bedeutet nicht, dass keine anderen Threads für Dom-Manipulation oder Inhalts-Rendering verwendet werden. Dies bedeutet, dass JS-Thread möglicherweise die Ausführung anderer Threads blockieren kann. Und Threads haben möglicherweise keine Beziehung zum Prozessmodell des Browsers (ein Prozess pro Seite oder ein Prozess für das gesamte Browserfenster) –