2008-08-05 4 views
83

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

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

ответ

105

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

var newWin = window.open(url);    

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

Он не работает с Chrome ;-(лучше использовать решение Kevin B ниже. – sly63 2013-03-05 10:57:37

+0

Вот ответ для хрома: [обнаружение-заблокировано-всплывающее окно] (http://stackoverflow.com/questions/668286/detect-blocked-popup-in-chrome/1089792 # 1089792) – ajwaka 2014-02-18 14:08:48

+0

также читайте это: https://stackoverflow.com/a/20235765/2892117 – 2017-07-15 11:21:30

23

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

Надеется, что это помогает! :)

+1

не работает от меня Chrome (v26.0.1410.64) – 2013-05-13 11:51:46

27

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

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

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

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

0

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

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 для учета начального открытия и закрытия, поэтому он никогда не будет полностью точным. Это будет пример проб и ошибок.

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

Смежные вопросы