Welche Methoden blockieren in Javascript?

8

Ich versuche, die Standardmethode confirm() in Javascript zu überschreiben (mache eine nette Benutzeroberfläche und so). Ich habe 100 Einträge gelesen, dass es "nicht machbar" ist, aber ich möchte nicht aufgeben, bis ich es richtig gemacht habe. :)

Das eigentliche Problem ist natürlich, dass die confirm() -Methode alle JavaScript-Ausführungen blockieren muss, bis der Benutzer eine Option auswählt. Also, was sind die Methoden in Javascript, die Sperrverhalten haben? Ich bin in der Lage, mit 5 zu kommen:

  • alert() - passt nicht zu mir, weil es eine eigene unerwünschte Benutzeroberfläche anzeigt;
  • confirm() - das gleiche Problem wie alert() ;
  • Endlosschleife - selbst moderne Browser werden CPU wie verrückt wegfressen und ein "stop javascript?" nach ein paar Sekunden auffordern;
  • XmlHttpRequest im synchronen Modus - Art von, aber es betrifft Server ...
  • showModalDialog() - nett, aber ich brauche ein bestimmtes Design, plus es gibt einige Browserkompatibilitätsanforderungen ...

Der beste Ansatz, den ich bis jetzt habe, ist ein <iframe> mit der Eingabeaufforderung zu erstellen (was dann einen eigenen JavaScript-Ausführungs-Thread erhält) und mit XmlHttpRequest zu blockieren, bis der Benutzer eine Option in <iframe> ausgewählt hat. Leider bedeutet dies, dass das Ergebnis zwischen dem Server hin- und hergereicht wird, und ich möchte diese 100% -Client-Seite machen. Außerdem bindet es einen Server-Thread, während das Dialogfeld geöffnet wird, und es können einige Browser-spezifische AJAX-Timeouts gelten.

Kann jemand an andere Javascript-Methoden denken, die die Ausführung blockieren, die (ab) verwendet werden könnte, um den gewünschten Effekt zu erzielen?

    
Vilx- 05.06.2013, 08:08
quelle

1 Antwort

4

Nein, kann aus gutem Grund nicht gemacht werden . Die willkürliche, benutzerspezifische Benutzerinteraktion auf der Seite ist immer asynchron (ereignisbasiert) und funktioniert daher nicht mit irgendeiner Art von Blockierungsverhalten (das Ereignis, das die Endlosschleife stoppen würde, würde nur auftreten nachdem die Endlosschleife beendet ist).

Alle diese Blockierungsmethoden, die du erwähnt hast, führen ihre Benutzerinteraktion in einer anderen Umgebung als der Seite aus - die vom Browser gesteuerten alert / confirm / prompt Pop-ups, die von showModalDialog geladene andere Seite - und diese Umgebung müsste in der Lage sein, den Fokus zu bekommen, während der erste eingefroren ist.

Das Erstellen eines solchen Setups ist schwierig genug. Sie können jedoch fast jede JavaScript-Funktionalität (die keine asynchronen Callbacks erfordert) ausprobieren, da alle JS-Operationen standardmäßig synchron sind. Wenn Sie weiter experimentieren möchten, würde ich vorschlagen, die Methoden zu betrachten, die sich mit verschiedenen DOM-Umgebungen beschäftigen ( window.open , document.write , iframe.contentWindow cross-frame-access), um zu sehen, ob Sie einen dieser Spawn erhalten können eine zweite Umgebung, die parallel zuverlässig läuft.

    
Bergi 16.10.2014 00:52
quelle