Zasada Chromium w oknach dialogowych JavaScriptu

Historia okien JavaScript

JavaScript wprowadzono w 1995 roku, a w pierwszej wersji tego języka korzystano z metod w obiekcie window o nazwie alert(), confirm() i prompt().

Choć można je dopasować do współczesnych przeglądarek, synchroniczny interfejs API może stanowić problem dla współczesnych przeglądarek. Mechanizm JavaScript musi wstrzymać działanie do czasu uzyskania odpowiedzi użytkownika, więc okna dialogowe JavaScript mają charakter modalny. Okna są zazwyczaj wyświetlane w aplikacji, więc zwykle (i kiedyś) są wykorzystywane do krzywdzenia naszych użytkowników.

Z tego powodu zespół Chromium zdecydowanie odradza używanie okien dialogowych JavaScript.

Inne rozwiązania

Jest wiele opcji zastępowania okien.

alert()/confirm()/prompt() ma kilka możliwości. Do powiadamiania użytkownika o wydarzeniach (np. witrynach kalendarzy) należy używać interfejsu Notifications API. Do uzyskiwania danych wejściowych użytkownika należy używać elementu HTML <dialog>. Na potrzeby modeli koncepcyjnych XSS można użyć funkcji console.log(document.origin) narzędzia devtool.

Jeśli chodzi o onbeforeunload, należy zaznaczyć, że jest już zawodna. Ilya Grigorik wskazuje: „nie możesz polegać na uruchamianiu zdarzeń pagehide, beforeunload i unload na platformach mobilnych. Jeśli chcesz zapisać stan, użyj interfejsu Widoczność strony.

Zmiany

Możliwość określania przez stronę ciągu onbeforeunload została usunięta w Chrome 51. (Usunęli ją również w Safari od Safari 9.1 i Firefoksie 4).

Okna alert()/confirm()/prompt() zmieniły się z okna modalnego na aplikację z możliwością zamknięcia po przełączeniu karty z aplikacji. Ta zmiana została wprowadzona we wszystkich kanałach na początku maja 2017 r.

Okna przeglądarki beforeunload wymagają gestu użytkownika na stronie, aby umożliwić wyświetlanie ich od wersji Chrome 60. (Nie zmienia to wysyłania zdarzenia beforeunload). Przypomina to przeglądarkę Firefox, która wprowadziła tę zmianę w przeglądarce Firefox 44.

Wyświetlenie okna alert()/confirm()/prompt() w trybie pełnoekranowym spowoduje utratę pełnego ekranu od wersji Chrome 61.

prompt() okna nie aktywują karty. Jeśli funkcja prompt() zostanie wywołana z karty w tle, zostanie zwrócona natychmiast i nie wyświetli się żadne okno. Ta zmiana pojawiła się we wszystkich kanałach na początku maja 2017 r.

alert() okna nie aktywują karty. Jeśli funkcja alert() zostanie wywołana z karty w tle, zostanie zwrócona natychmiast. Karta jest oznaczona odpowiednim wskaźnikiem, a po przejściu na kartę użytkownik zobaczy okno dialogowe. Ta zmiana działania jest widoczna w Chrome od wersji 64.

confirm() okna nie aktywują karty. Jeśli funkcja confirm() zostanie wywołana z karty w tle, zostanie zwrócona natychmiast i nie wyświetli się żadne okno. Ta zmiana działania jest widoczna w Chrome w wersji 69.

Dlatego, jeśli Twoja witryna korzysta z okna, zdecydowanie zalecamy przejście na wyżej wymienione alternatywy, ponieważ takie rozwiązanie nie będzie miało na Ciebie wpływu.