Okna przeglądarki
Za pomocą JavaScript możemy otwierać nowe okna, formatować ich wygląd, przesyłać między nimi informacje itp.
Przez kilka ostatnich lat sporo się pozmieniało w materii otwierania nowych okien. Po pierwsze większość przeglądarek blokuje otwieranie nowych okien na stronach. Po drugie użytkownicy nie lubią gdy próbuje im się narzucić nowe okna. Po trzecie wreszcie - otwieranie okien na urządzeniach mobilnych mija się z celem. Co najwyżej możemy otworzyć stronę w nowej karcie.
Wszystkie te punkty powodują, że nie zalecam otwierania nowych okien, a zamiast ich zalecam używać wszelakiej maści popupów czy modali - najlepiej korzystając z gotowych rozwiązań (1, 2, 3)
Otwieranie nowego okna
Standardowa konstrukcja otwierająca okno ma postać:
const win = window.open(url, name, options)name
nazwa okna, do której możemy się odwoływać atrybutem target w linkach i formularzach. Możemy też tutaj podać target="_blank" jeżeli chcemy otworzyć okno jako nową kartę
options
Dodatkowe opcje otwieranego okna, opisane poniżej
Wszystkie możliwe ustawienia znajdziesz na stronie https://developer.mozilla.org/pl/docs/Web/API/Window/open, poniżej zamieszczam te najczęściej używane. Tutaj mała uwaga. Przeglądarki są bardzo wybredne jeżeli chodzi o otwierane okna, dlatego nie wszystkie poniższe właściwości będą wszędzie działać.
top
pozycja okna względem góry ekranu
height
ustawia wysokość okna
width
ustawia szerokość okna
menubar
(yes/no) pokazuje lub ukrywa menu przeglądarki
toolbar
(yes/no) pokazuje lub ukrywa standardowy pasek narzędzi
location
(yes/no) pokazuje lub ukrywa pasek adresowy
directories
(yes/no) pokazuje lub ukrywa przyciski katalogów
status
(yes/no) pokazuje lub ukrywa pasek statusu
resizable
(yes/no) określa czy okno może zmienić rozmiar
scrollbars
(yes/no) pokazuje lub ukrywa paski przewijania
dialog
(yes/no) Usuwa z okna wszystkie menu, statusy itp, zostawiając tylko przycisk zamykania
noopener
Zapobiega używaniu zmiennej opener w otwieranych oknach.
noreferrer
Zapobiega wysyłaniu informacji o adresie, z której została otwarta strona w oknie. Dodatkowe informacje możesz zobaczyć tutaj
minizable
(yes/no) używane wraz z dialog. Jeżeli ustawimy na yes, dialog dodatkowo będzie można zminimalizować
Przykładowa funkcja, która otworzy okno na środku ekranu może mieć postać:
Modyfikacja okna
Dzięki przypisaniu nowego okna pod zmienną, możemy nim w łatwy sposób manipulować. Zasady są identyczne jakie stosowaliśmy w rozdziale o DOM - jedyna różnica polega na odwołaniu, gdzie musimy użyć zmiennej, pod którą podstawimy otwarte okno:
Właściwość opener
Jedną z ciekawszych ale i niebezpiecznych właściwości otwartych okien/zakładek jest właściwość opener. Dzięki niej możemy się odwoływać do okna, z którego utworzyliśmy nowe okno.
Sprawdźmy to:
Otwórz okno testowe
Jak zauważysz korzystając z właściwości opener, mogę nieźle namieszać na stronie, która otworzyła takie okno.
Może to być początek groźnego ataku. Wyobraź sobie, że zamiast otwierać małe okienko, otworzę stronę w nowej zakładce. Równocześnie mogę np. przekierować stronę, która otworzyła nowe okno za pomocą kodu:
Ty wracasz na swoją stronę i widzisz, że zostałeś niechcący wylogowany ze swojego konta. Logujesz się i... Właśnie przejąłem twoje hasła do twojego konta, ponieważ zalogowałeś się na fejkową stronę na domenie mbąnk. Jasne - nie każdy z nas ma konto w mBanku. I pewnie większość wzmocni swoją uwagę, gdyby zaistniała powyższa sytuacja.
Ale nie oszukujmy się - przecież wśród nas jest pełno osób, które bardzo łatwo nabierają się na wnuczków policjantów, blokady komputera nakładane przez FBI, lecznicze kołdry itp. A przecież mówimy powyżej o prostym przekierowaniu. Podobne ataki mogą być bardziej wymyślne, bo mogą zmieniać zdarzenia przypisane do elementów, ich html, ustawiać niewidzialne elementy itp.
Z tego też powodu przy otwieraniu nowych okien, powinieneś używać właściwości noopener.
Jeszcze w czasach IE11 podobne zabezpieczenie powinieneś stosować w linkach, gdzie otwierasz stronę w nowej zakładce za pomocą target="_blank". Służy do tego atrybut rel="noopener":
W dzisiejszych czasach dla linków możesz je pominąć.
Last updated