Jak mogę wykryć, że przeglądarka blokuje wyskakujące okienko?

Czasami natknąłem się na stronę internetową, która próbuje otworzyć nowe okno (dla wprowadzenia użytkownika lub czegoś ważnego), ale blokada popup zapobiega temu.

Jakich metod może użyć okno wywołujące, aby upewnić się, że nowe okno zostało poprawnie uruchomione?

 97
Author: Gerstmann, 2008-08-06

6 answers

Jeśli używasz JavaScript, aby otworzyć wyskakujące okienko, możesz użyć czegoś takiego:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
 120
Author: omar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 16:54:20

Próbowałem kilku powyższych przykładów, ale nie mogłem ich zmusić do pracy z Chrome. To proste podejście wydaje się działać z Chrome 39, Firefox 34, Safari 5.1.7 i IE 11. Oto fragment kodu z naszej biblioteki JS.

openPopUp: function(urlToOpen) {
    var popup_window=window.open(urlToOpen,"myWindow","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=yes, width=400, height=400");            
    try {
        popup_window.focus();   
    } catch (e) {
        alert("Pop-up Blocker is enabled! Please add this site to your exception list.");
    }
}
 34
Author: DanielB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 16:57:12

To rozwiązanie do sprawdzania blokowania popupów zostało przetestowane w FF (v11), Safari (v6), Chrome (v23.0.127.95) i IE (v7 i v9). Zaktualizuj funkcję _displayError, aby obsłużyć komunikat o błędzie według własnego uznania.

var popupBlockerChecker = {
    check: function(popup_window){
        var _scope = this;
        if (popup_window) {
            if(/chrome/.test(navigator.userAgent.toLowerCase())){
                setTimeout(function () {
                    _scope._is_popup_blocked(_scope, popup_window);
                },200);
            }else{
                popup_window.onload = function () {
                    _scope._is_popup_blocked(_scope, popup_window);
                };
            }
        } else {
            _scope._displayError();
        }
    },
    _is_popup_blocked: function(scope, popup_window){
        if ((popup_window.innerHeight > 0)==false){ 
            scope._displayError();
        }
    },
    _displayError: function(){
       alert("Popup Blocker is enabled! Please add this site to your exception list.");
    }
};

Użycie:

var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);
Mam nadzieję, że to pomoże! :)
 26
Author: Kevin B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 16:56:47

Jednym "rozwiązaniem", które będzie Zawsze działać niezależnie od firmy przeglądarki lub wersji jest po prostu umieścić komunikat ostrzegawczy na ekranie, gdzieś blisko kontrolki, która utworzy wyskakujące okienko, które grzecznie ostrzega użytkownika, że akcja wymaga wyskakującego okienka i proszę włączyć je dla witryny.

Wiem, że to nie jest wymyślne czy coś, ale nie może być prostsze i wymaga tylko około 5 minut testów, potem można przejść do innych koszmarów.

Gdy użytkownik ma dozwolone wyskakujące okienka dla Twojej witryny, byłoby również rozsądne, jeśli nie przesadzisz z wyskakującymi okienkami. Ostatnią rzeczą, którą chcesz zrobić, to drażnić swoich gości.

 10
Author: UncaAlby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-26 22:49:35

Próbowałem wielu rozwiązań, ale jedynym, który mogłem wymyślić, działał również z uBlock Origin, było użycie limitu czasu, aby sprawdzić zamknięty status wyskakującego okienka.

function popup (url, width, height) {
    const left = (window.screen.width / 2) - (width / 2)
    const top = (window.screen.height / 2) - (height / 2)
    let opener = window.open(url, '', `menubar=no, toolbar=no, status=no, resizable=yes, scrollbars=yes, width=${width},height=${height},top=${top},left=${left}`)

    window.setTimeout(() => {
        if (!opener || opener.closed || typeof opener.closed === 'undefined') {
            console.log('Not allowed...') // Do something here.
        }
    }, 1000)
}

Oczywiście jest to hack; jak wszystkie rozwiązania tego problemu.

Musisz zapewnić wystarczającą ilość czasu w ustawieniu, aby uwzględnić początkowe otwarcie i zamknięcie, więc nigdy nie będzie dokładnie dokładne. Będzie to pozycja prób i błędów.

Dodaj to do swojej listy próby.

 0
Author: Michael Giovanni Pumo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 16:57:40

Używając zdarzenia onbeforeunload możemy sprawdzić w następujący sposób

    function popup()
    {
        var chk=false;
        var win1=window.open();
        win1.onbeforeunload=()=>{
            var win2=window.open();
            win2.onbeforeunload=()=>{
                chk=true;
            };
        win2.close();
        };
        win1.close();
        return chk;
    }

Otworzy 2 czarne okna w tle

Funkcja zwraca wartość logiczną.

 0
Author: Yash Bora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 15:56:05