Firefox i zapętlony window.alert

Kiedyś zastanawiałem się jak to możliwe jest, że Firefox nadal nie posiada tak oczywistej opcji jak zatrzymanie wykonywania skryptów na stronie, gdy przykładowo zirytuje nas kolejne już okienko dialogowe (alert) z komunikatem.
Kilka klików więcej to nic szczególnego, ale gdy przypadkowo trafimy na stronę ze skryptem wykorzystującym window.alert w pętli, to zaczyna się problem... W tym wpisie przedstawię kilka satysfakcjonujących rozwiązań tego problemu.

Nie odwiedzam podejrzanych stron, ale na pomysł umieszczenia takiego irytującego skryptu może wpaść każdy. Raz natrafiłem na 'dzieło' jakiegoś miłośnika Opery, który postanowił powiadomić mnie o jej zaletach w taki właśnie sposób. Nie mam nic przeciwko 'Operowcom', ale ten jedyny został przeze mnie zapamiętany :)

Nic wielkiego się nie stało, ale pomyślmy - alert() nie pozwala z Firefoksem zrobić cokolwiek, zanim nie klikniemy 'OK'. W pętli po naciśnięciu 'Ok' znów zobaczymy kolejny alert. Krążą plotki o tym, że między kolejnymi alertami w 'czystej' pętli mamy milisekundy na inną akcję. Nie udało mi się tego potwierdzić - era bardzo wolnych komputerów już minęła :)

Zwykły zapętlony alert() może skutecznie zniszczyć to, nad czym obecnie pracujemy wykorzystując przeglądarkę, ponieważ chyba jedyną skuteczną metodą jest zabicie procesu Firefoksa. Firefox dość dobrze radzi sobie z przywracaniem stanu wcześniejszego, ale nie można pozwalać na takie akcje - przecież to absurd aby byle dowcipniś zmuszał mnie do takiej zabawy. Twórcy Opery czy Chrome dawno o tym pomyśleli. Co użytkownicy Firefoksa mają do wyboru?

1. NoScript
To dodatek który pozwala blokować wykonywanie skryptów JavaScript i apletów Java na stronach internetowych. Czy dla zwykłego alert() warto uciekać do takich rozwiązań? Na pewno nie. NoScript ma swoje zalety, ale ja z domyślnie włączonego JS nie potrafię rezygnować. Szukajmy dalej...

2. Mniej ssące window.alert()
Teraz czas na konkrety. Riddle już kilka lat temu napisał skrypt do Greasemonkey który całkowicie zmienia zachowanie się alerta.

Dzięki temu skryptowi alert będzie zachowywał się jak zwykła wypozycjonowana warstwa - znika wiele ograniczeń. Już nie ma konieczności klikania 'Ok' aby korzystać normalnie z przeglądarki (okienko sobie poczeka nie dopominając się o naszą reakcję na nie). Zachowanie okienka staje się całkowicie neutralne i nie ma wpływu na inne działania związane z przeglądarką. Wygląd można podejrzeć na obrazku wyżej. Dodatkowo zyskujemy możliwość wyświetlenia wielu alertów jednocześnie, a nie kolejno jak jest domyślnie.

Rozwiązanie ma także wady, o czym wspomina Riddle:

Greasemonkey ma swoje ograniczenia i nie jest w stanie przechwycić zdarzeń występujących wcześniej niż DOMContentLoaded (załadowanie DOM, bez np.: obrazków).

W przypadku 'pętli alertowej' przeglądarka wyświetli jednocześnie wiele okienek i przeglądarka chwilowo zawiesi się (swobodnie działająca pętla pochłonie zasoby procesora), ale po chwili pojawi się komunikat pytający czy zatrzymać wykonywanie skryptów na stronie.

Można samemu poprawić skrypt tak, aby nie doprowadzać do chwilowego zwieszenia przeglądarki w takich sytuacjach.

Bezpośredni link do skryptu: zainstaluj. Rozwiązanie to pozwala uniknąć konieczności resetowania przeglądarki gdy natrafimy na dzieło internetowych głupców.

3. Firefox jak Opera - dodatek

Kilka miesięcy temu Mike Conley stworzył dodatek do Firefoksa dzięki któremu przeglądarka zyskuje funkcjonalność znaną przykładowo z Opery.

Link bezpośredni do dodatku: instaluj.

Różnice tego rozwiązania między rozwiązaniem znanym przykładowo z Opery istnieją. Tutaj nie zobaczymy opcji wyłączenia przy pierwszym alercie na stronie, dopiero przy kolejnym. Drugą różnicą jest to, że zaznaczenie opcji powoduje tylko wyłączenie działania alert(), a nie javascriptu w całości.

W przypadku 'pętli alertowej' przeglądarka chwilowo zawiesi się z podobnego powodu co w wyżej wspomnianym przypadku. Nie ma konieczności resetowania przeglądarki, tak więc w takim przypadku swobodne kontynuowanie pracy będzie możliwe.

Przetestuj (uważaj w co klikasz)
W czytnikach RSS niżej podane linki prawdopodobnie nie będą działać.
Jeśli korzystasz z Firefoksa i chcesz przetestować opisywany skrypt lub dodatek, to kliknij tutaj: javascript:alert('Klikaj, klikaj, klikaj...'); (to zwykły, niezapętlony alert).
Zapętlony alert dostępny tutaj: javascript:while(true)alert('Klikaj, klikaj, klikaj...').

Do testów może posłużyć także strona która wyświetla alerty przy próbie jej zamknięcia.

Zagadka na koniec
Postawmy się w takiej sytuacji - korzystamy z Firefoksa, Safari, lub z innej przeglądarki która nie jest odporna na zapętlone alerty (nie dodaliśmy zabezpieczenia także samodzielnie i mamy włączoną obsługę JS). Mamy otwarte kilka kart. Jedna z nich ze stroną na której robimy coś ważnego w pracy, na przykład gramy w grę we flashu będąc na przedostatnim poziomie. Dostajemy w tym czasie link od znajomego i trafiamy na zapętlonego alerta - co zrobić abyśmy mogli kontynuować to, co wcześniej robilismy? ;)

Czy polowanie na milisekundy między alertami jest jedynym wyjściem? Co zrobić gdy wydajność komputera jest zbyt duża? - obniżamy ją chwilowo? ;)
A może coś innego? Ciekaw jestem czy uda się stworzyć coś ciekawego.

Wpis powstał dzięki blogerowi Vmario który przypomniał mi o problemie z Firefoksem.

Komentarze 269:

  • » kwiateusz: 13.06.2009 o 20:06

    Ja testowałem ctrl+w i enter druga reką, karkołomne zadanie ale wykonalne po chwili :D

  • » Analizator: 13.06.2009 o 20:46

    Jak zobaczyłem okienko na obrazku to odruchowo w nie kliknąłem :)

  • » Livio: 13.06.2009 o 20:53

    Zapętlony alert() to zło konkretne. Zabija Firefoksa.

    Krążą plotki o tym, że między kolejnymi alertami w 'czystej' pętli mamy milisekundy na inną akcję. Nie udało mi się tego potwierdzić - era bardzo wolnych komputerów już minęła :)

    A to mnie zdołowało, bo udało mi się nieraz na mojej maszynie zamknąć kartę z upartą stroną, a wydawało mi się, że nie stoję na szarym końcu w statystykach dot. sprzętu ^^ . Cóż, panta rhei, mój sprzęt także. W kierunku szarego końca ^^ .

  • » Adriano: 13.06.2009 o 21:47

    Testowałem sposób jaki podał 'kwiateusz', czyli z Ctrl+w i enterem. Raz nawet się udało.
    Firefox taki znów mega-szybki nie jest, mój sprzęt też nie.

  • » pim: 14.06.2009 o 09:17

    Zainstalowałem ten skrypcik Riddle'a no i teraz jest o tyle gorzej, że po kliknięciu w link z zapętlonym alertem, przeglądarka się zawiesza i koniec zabawy.

  • » Adriano: 14.06.2009 o 10:30

    Ale po kilku sekundach powinno pojawić się okienko z pytaniem czy przerwać wykonywanie skryptów na stronie.

  • » procek: 15.06.2009 o 19:22

    Jedna z nich ze stroną na której robimy coś ważnego w pracy, na przykład gramy w grę we flashu będąc na przedostatnim poziomie.

    Tylko, że te gierki często zapisują sobie w cookies stan :P
    A co do szybkiego zamykania - w pewnych sytuacjach to nie zadziała (otwarta sesja przeglądania konta bankowego, tragiczne orange.pl), ale:
    Zabijamy proces, uruchamiamy ponownie przeglądarkę, szybko zamykamy kartę z tym "szajsem", póki się nie załaduje - reszta kart wczyta się do końca i sytuacja opanowana ;)

  • » KKKas: 24.07.2009 o 22:22

    Ja wykorzystuję do tego mój stary, magiczny program -- Object editor.

    http://kacper.kwapisz.eu/index.php?i=7
    http://kacper.kwapisz.eu/images/objecteditor1.jpg (screen)

    1. Odpalamy program
    2. Najeżdżamy myszką na okno Firefoksa (cokolwiek, byle nie okno alerta).
    3. Wciskamy globalny skrót: Shift+Alt+Enter
    4. Klikamy 'Enable'
    5. Zamykamy kartę ze stroną, na której jest zapętlony alert.

    Włala. Uratuje nas w sytuacji, gdy np. nie jesteśmy u siebie, a trafimy na tego typu stronę, z zapętlonym alertem.

  • » Syl: 23.08.2009 o 11:37

    Ale takich stron chyba jest nie wiele, nie przypominam sobie przynajmniej, takich zapętlonych alertów FF. Chociaż sam FF ma swoje wady i jak napisał Adriano do najszybszy to nie należy.

  • » Patryk: 09.11.2009 o 13:31

    Alert alertem, ale pamiętam jeszcze patent na wywalanie iexplore jak dało się png z width ok. miliona. Co prawda nie testowałem tych alertow na golym ff 3.5, ale az ciezko uwierzyc, ze takie niedorobki jeszcze sa widoczne w naszym "ukochanym" fajerfoksie.

  • » Grzegorz: 19.01.2010 o 22:51

    [AlertStopper](https://addons.mozilla.org/pl/firefox/addon/13530) blokuje powtarzające się okienka wywoływane za pomocą funkcji alert() i confirm() w Firefoksie.

  • » Xim: 06.02.2010 o 11:11

    Eee... IMHO wystarczy Ctrl+W przytrzymać, kliknąć OK myszką, zakładka zamyka się, pozostaje tylko ostatni alert i jedno kliknięcie OK.

    Nie trzeba żadnych dodatków i kombinacji :)

  • » Warchol: 04.10.2010 o 08:01

    Hehe, w Operze jest fajna funkcja do tego "zablokuj wykonywanie skryptów na stronie" :)

  • » Marcin: 06.12.2010 o 13:22

    A mam pytanie trochę z innej beczki, firefox od jakiegoś czasu po włączeniu np filmu wykorzystuje cały 1 procesor(ogólnie strasznie muli kompa) ktoś wie jak go skonfigurowac? a może to wina codeców?

Dodaj komentarz:

Dostępne tagi: [link]http://adres-www[/link] [quote]cytat[/quote] [code]kod[/code] [pre]tekst preformowany[/pre] [b]bold[/b]