Как я могу определить, если браузер блокирует всплывающие окна?

голоса
88

Иногда, я наткнулся на веб-страницу, которая пытается поп открыть новое окно (для ввода данных пользователем, или что-то важное), но блокировщик всплывающих окон предотвращает это.

Какие методы вызывающего окно можно использовать, чтобы убедиться, что новое окно запущены правильно?

Задан 05/08/2008 в 23:01
источник пользователем
На других языках...                            


7 ответов

голоса
109

Если открыть всплывающее окно используется JavaScript, вы можете использовать что-то вроде этого:

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
    //POPUP BLOCKED
}
Ответил 05/08/2008 в 23:03
источник пользователем

голоса
24

Это решение для проверки блокировщик всплывающих окон было протестировано в FF (v11), Safari (v6), хром (v23.0.127.95) & IE (V7 и V9). Обновление функции _displayError, чтобы обработать сообщение об ошибке, как вы считаете нужным.

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

Применение:

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

Надеюсь это поможет! :)

Ответил 30/11/2012 в 21:39
источник пользователем

голоса
30

Я попробовал несколько примеров выше, но я не мог заставить их работать с Chrome. Этот простой подход, кажется, работает с Chrome 39, Firefox 34, Safari 5.1.7 и IE 11. Вот фрагмент кода из библиотеки 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.");
    }
}
Ответил 31/12/2014 в 19:16
источник пользователем

голоса
10

Один «решение» , который будет всегда работать независимо от браузера компании или версии, чтобы просто поставить предупреждающее сообщение на экране, где - то близко к элементу управления , что позволит создать всплывающее окно, что вежливо предупреждает пользователя о том , что действие требует поп- и угождать включить их на сайте.

Я знаю, что это не фантазии или что-нибудь, но он не может получить какой-либо проще и требует только около 5 минут тестирования, то вы можете перейти к другим кошмаров.

После того, как пользователь разрешает всплывающие окна для вашего сайта, было бы также быть внимательным, если не переусердствовать всплывающих окон. Последнее, что вы хотите сделать, это раздражать посетителей.

Ответил 26/02/2016 в 22:49
источник пользователем

голоса
0

Я пробовал много решений, но только один я мог придумать, что также работал с uBlock происхождения, был с использованием тайм-аут, чтобы проверить закрытый статус всплывающего окна.

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

Очевидно, что это хак; как и все решения этой проблемы.

Вы должны предоставить достаточно времени в вашем SetTimeout для учета первоначального открытия и закрытия, поэтому он никогда не будет полностью точным. Это будет позиция проб и ошибок.

Добавьте это в свой список попыток.

Ответил 30/01/2018 в 12:29
источник пользователем

голоса
0

Используя onbeforeunload событие можно проверить следующим образом

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

она будет открыта 2 черные окна в фоновом режиме

функция возвращает логическое значение.

Ответил 29/05/2018 в 14:56
источник пользователем

голоса
0

Я объединил @Kevin B и @ решений DanielB в.
Это гораздо проще.

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

Использование:

var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
    // Do what you want.
}
Ответил 27/02/2019 в 05:53
источник пользователем

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