devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

Wykrycie blokady popupów w różnych przeglądarkach


14.06.2011

Aplikacja, którą tworzę, w pewnych cyrkumstancjach wymaga odblokowanych popupów. Postępowanie nasuwa się samo – trzeba wykryć czy popupy są odblokowane i pokazać jakieś ostrzeżenie, jeśli nie są. Myślałem, że będzie to kwadrans roboty…

No i faktycznie byłby to kwadrans, jeśli nie odpaliłbym więcej niż jednej przeglądarki. Jak to w świecie webdev bywa, to samo raz działa tak, a raz srak, w zależności od tego co jest naszym oknem na świat.

Poniżej efekt ponad dwóch godzin prób i błędów, który (jak mi się wydaje) działa w IE, FF, Chrome i Operze:

  1:  function detectPopupsPermission() {
  2:      var popup = window.open('about:blank', '', 'directories=no,height=10,width=10,menubar=no,resizable=no,scrollbars=no,status=no,titlebar=no,location=no');
  3:  
  4:      /* IE & FF */
  5:      if (!popup) {
  6:          popupsBlocked();
  7:      }
  8:      /* Opera */
  9:      else if (/opera/i.test(navigator.userAgent) && !popup.outerWidth) {
 10:          popupsBlocked();
 11:      }
 12:      /* Chrome */
 13:      else if (/chrome/i.test(navigator.userAgent)) {
 14:          // chrome sets outerWidth after some time, not immediately
 15:          setTimeout(function() {
 16:              if (popup.outerWidth === 0) {
 17:                  popupsBlocked();
 18:              } else {
 19:                  popupsAllowed();
 20:              }
 21:          }, 100);
 22:      }
 23:      else {
 24:          popupsAllowed();
 25:      }
 26:  };

Sugestie, opinie?

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Notify of
Kuba
Kuba

osx 10.4: safari 4.1, opera 10.1, firefox 3.5

można jeszcze zastosować coś takiego http://www.bennadel.com/blog/672-Passing-Data-From-A-Pop-Up-Window-To-A-Parent-Window-Using-ColdFusion-And-Javascript.htm

marek

Witam,
ja osobiście nie pchałbym się w popup’y. Użyłbym np. jQueryUI modal dialog (http://jqueryui.com/demos/dialog/#modal) jeśli już trzeba.

Pozdrawiam,
Marek

procent

marek,
To prawda, w miarę możliwości popupów dobrze jest unikać. Ale wymaganie "treść może być wyświetlona jako ‘modal dialog’ LUB jako zewnętrzny popup, w zależności od preferencji użytkownika" to pozostawia raczej niewielkie pole manewru:).

twk
twk

No jak dla mnie to przegiąłeś stylistycznie z "w pewnych cyrkumstancjach". Włos mi się zjeżył. To tak jakbyś użył w podanym kodzie if…then…goto

To samo komentatorzy sportowi: golkiper drużyny x…. kurcze no to przecież bramkarz jest, zwykły bramkarz, jest takie słowo, funkcjonuje i nie razi.

Co do merytoryki kodu… jakoś nie pasi mi ten timeout dla Chrome.

procent

twk,
"cyrkumstancja" to jak najbardziej polskie słowo, tyle że nietypowe ( http://sjp.pwn.pl/haslo.php?id=2554050 ).

Mi timeout też nie pasi, ale nie znalazłem innego sposobu na wykrycie tego w Chrome. Chętnie skorzystam jeśli posiadasz ładniejsze rozwiązanie tego problemu.

miodek
miodek

To nie mogłeś po prostu napisać "okolicznościach" ?

procent

miodek,
Mogłem. Mogłem też cały post napisać w języku staro-cerkiewno-słowiańskim. Ale chyba w tym jednym kątku internetu mam prawo pisać jak mi się podoba, nawet jeśli wyglądać to będzie dziwacznie?

miodek
miodek

Dla mnie to słowo to zbędny zamiennik/zapożyczenie z obcego do już istniejących słów.

Moja książka

Facebook

Zobacz również