Hoe kan ik detecteren of een browser blokkeert een popup?

stemmen
88

Af en toe heb ik over een webpagina die probeert om pop openen van een nieuw venster (voor invoer van de gebruiker, of iets belangrijks) komen, maar de pop-up blocker voorkomt dit.

Welke methoden kan de bellende venster te gebruiken om het nieuwe venster op de juiste gelanceerd ervoor te zorgen?

De vraag is gesteld op 05/08/2008 om 23:01
bron van user
In andere talen...                            


7 antwoorden

stemmen
109

Als u JavaScript gebruiken om de pop-up te openen, kun je zoiets als dit gebruiken:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
antwoordde op 05/08/2008 om 23:03
bron van user

stemmen
30

Ik probeerde een aantal van de bovenstaande voorbeelden, maar ik kon niet krijgen ze aan het werk met Chrome. Deze eenvoudige aanpak lijkt te werken met Chrome 39, Firefox 34, Safari 5.1.7, en IE 11. Hier is het fragment van de code van onze JS bibliotheek.

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.");
    }
}
antwoordde op 31/12/2014 om 19:16
bron van user

stemmen
24

Deze oplossing voor het pop-up blocker controle is getest in FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 en v9). Werk de _displayError functie om de foutmelding te behandelen als het je past.

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.");
    }
};

Gebruik:

var popup = window.open("http://www.google.ca", '_blank');
popupBlockerChecker.check(popup);

Ik hoop dat dit helpt! :)

antwoordde op 30/11/2012 om 21:39
bron van user

stemmen
10

Een "oplossing" die zal altijd werken, ongeacht de browser bedrijf of versie is simpel gezegd een waarschuwing op het scherm, ergens dicht bij de controle die een pop-up zal leiden, dat beleefd waarschuwt de gebruiker dat de actie een pop- en om te behagen hen in staat stellen voor de site.

Ik weet dat het geen zin heeft of iets dergelijks, maar het kan niet eenvoudiger te krijgen en vergt slechts ongeveer 5 minuten testen, dan kunt u gaan naar andere nachtmerries.

Zodra de gebruiker pop-ups voor uw site is toegestaan, zou het ook attent zijn als je niet de pop-ups overdrijven. Het laatste wat je wilt doen is ergeren uw bezoekers.

antwoordde op 26/02/2016 om 22:49
bron van user

stemmen
0

Ik combineerde @Kevin B @ oplossingen danielb's.
Dit is veel eenvoudiger.

var isPopupBlockerActivated = function(popupWindow) {
    if (popupWindow) {
        if (/chrome/.test(navigator.userAgent.toLowerCase())) {
            try {
                popupWindow.focus();
            } catch (e) {
                return true;
            }
        } else {
            popupWindow.onload = function() {
                return (popupWindow.innerHeight > 0) === false;
            };
        }
    } else {
        return true;
    }
    return false;
};

Gebruik:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}
antwoordde op 27/02/2019 om 05:53
bron van user

stemmen
0

Door het gebruik van onbeforeunload evenement die wij als volgt controleren

    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;
    }

Het zal openen 2 zwarte ramen in de achtergrond

retourneert de functie boolean waarde.

antwoordde op 29/05/2018 om 14:56
bron van user

stemmen
0

Ik heb geprobeerd veel oplossingen, maar de enige die ik kon bedenken, die ook werkte met uBlock Origin, was door gebruik te maken van een time-out om de gesloten status van de pop-up te controleren.

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)
}

Uiteraard is dit een hack; net als alle andere oplossingen voor dit probleem.

Je moet voldoende tijd te geven in uw setTimeout om rekening te houden voor de eerste openen en sluiten, dus het zal nooit grondig nauwkeurig te zijn. Het zal een positie van trial and error.

Voeg dit toe aan uw lijst van pogingen.

antwoordde op 30/01/2018 om 12:29
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more