Blokující modál okno rubrika: Programování: JavaScript
V normálním prohlížeči máme k dispozici dialogové okno: window.alert(), window.prompt(), window.confirm(). Obvykle si člověk ale vytváří vlastní okna, protože je chce mít hezčí, a lépe formátované. Jenže je zajímavé, že tyto originální window.confirm() jsou blokující. Tedy, když v nějakém kódu zavolám tuto funkci, tak se mi ten kód zastaví, a dokavad to okno neodkliknu, tak nepokračuje.
Vůbec mě nenapadá jak to udělat u těch vlastních oken. Jde to?
Úplně zastavit prohlížeč tak, jak to dělá alert nebo confirm, není dobrý nápad. Protože js se vykonává jednovláknově (ačkoliv to tak nevypadá díky frontě, do které se ukládají asynchronní volání, které se začnou vykonávat když se vyprázdní callstack), tak při zastavení prohlížeče opravdu nic nefunguje. Tudíž se ani nevyvolávají události ze stisku tlačítka definovaného v HTML a často to tlačítko ani nejde stisknout. Takže by ani nebylo čím ten modal zavřít. Úplné zastavení je to samé, jako když je otevřena ladicí konzole a v kódu je příkaz debugger; nebo možná spíše jako příkaz for(;;);. Prostě nefunguje nic. Takže zastavovat prohlížeč (interpret js) je blbý nápad. A zastavit ho tak nějak napůl, to je přesně ten callback (resp. promise), který je tu už zmíněný.
Zkráceně: Zastavit prohlížeč tak, jak to dělá confirm, nejde, protože se tím zastaví i JS a pak není nic, co by ten modal mohlo zavřít. Confirm má tlačítka, jejichž funkčnost není psána v JS a proto mu to nevadí.
Superzkráceně: Když se zastaví vykonávání kódu v jednovláknovém systému, tak nemám druhé vlákno, kterým bych ho mohl zase spustit.
PS: Možná by to šlo nějak obejít otevřením dalšího okna prohlížeče. Tím by se vlastně dosáhlo více vláken vedle sebe a jedno okno by mohlo čekat ve smyčce a druhé okno by mohlo tu smyčku ukončit nastavením nějaké proměnné. Ale pouze teoretizuji a ostře to nedoporučuji. Pravděpodobně by to stejně nefungovalo. Přepsat veškerý kód na promises je přímější a spolehlivější řešení.
Podrobně viz: https://www.zdrojak.cz/clanky/asynchronni-javascript-poklickou-aneb-even...
Komentáře
- Andreaw Fean : Děkuji za vyčerpávající odpověď. — 7.8.2020
Pro zobrazení všech 6 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře