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

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

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

Ответ 1

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

var newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
     //POPUP BLOCKED
}

Ответ 2

Я попробовал несколько примеров выше, но я не мог заставить их работать с 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.");
  }
}

Ответ 3

Это решение для проверки блокировки всплывающих окон было протестировано в FF (v11), Safari (v6), Chrome (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);

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

Ответ 4

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

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

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