Blokující modál okno rubrika: Programování: JavaScript

2 Andreaw Fean
položil/-a 30.7.2020

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?

Komentáře

  • dominios : Aj na zaklade diskusie pri odpovediach nizsie; mozem vediet naco je vlastne dobre naozaj dosiahnut to zablokovanie? Chapem, ze sa Vam nepaci, ze zatial ani jedno riesenie to na 100% nesplnilo, ale naozaj ma zaujima, v akom pripade by to blokovanie mohlo byt realne uzitocne. 7.8.2020
  • Andreaw Fean : Chtěl jsem nahradit window.confirm(). Kliknu na tlačítko. Zavolám confirm, ten mi vrátí ano/ne, pokud ne - stopnu tlačítko, pokud ano pokračuju tlačítkem. Bez blokování to jde taky, ale je to mnohem méně hezký, a mnohem víc drbání. 7.8.2020
  • dominios : Vdaka za reakciu. Dovolim si nesuhlasit s tvrdenim, ze "je to mene hezky". V JS sa to proste takto robi, asynchronnost, callbacky a pod. k JS kulture proste patria a jednoducho, tak sa s tym pracuje standardne. Mam pocit, ze Vy ste zvyknuty na ine (syncrhonne) jazyky, kde nieco take asi nie je (no offence; len konstatujem :). Ak sa teda aj nejako podari dosiahnut toto chovanie, bude prave taketo riesenie v JS svete "ne moc hezke" a teda asi ani nie velmi spravne. 11.8.2020
  • Andreaw Fean : Já s calbacky a s promise problém nemám. Já nemám problém s tím, že se to tak dělá. Myslím si, že to v tomto mém případě není hezký a není to věc nezvyku. Troufám si tvrdit, že JS znám dobře. A v tomto případě šlo o to, že jednak mi nedošlo, že ty alert a confirm jsou vlastně úplně mimo prohlížeč; a druhak mě přepadla zvědavost, zda by to šlo. Sám jsem na žádné řešení nepřišel, a tak se šel zeptat. 11.8.2020
odkaz Vyřešeno
2 mazane
odpověděl/-a 5.8.2020
 
upravil/-a 5.8.2020

Ú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:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.