Pop up blocker API-как проверить, включен ли пользователь

Мне нужно знать, когда пользователь нажимает на кнопку, запускающую window.open Если есть стабильный API / way знать заранее, если пользователь активно имеет блокировщик всплывающих окон?

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

5 ответов


Window.open(...) возвращает дескриптор в новое окно, если он существует. Если у него нет дескриптора нового окна, это довольно хороший признак того, что окно было заблокировано.

https://developer.mozilla.org/en-US/docs/Web/API/Window/open

From:https://davidwalsh.name/popup-block-javascript

var windowName = 'userConsole'; 
var popUp = window.open('/popup-page.php', windowName, 'width=1000, height=700, left=24, top=24, scrollbars, resizable');
if (popUp == null || typeof(popUp)=='undefined') {  
    alert('Please disable your pop-up blocker and click the "Open" link again.'); 
} 
else {  
    popUp.focus();
}

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

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

Почему наши всплывающие окна заблокированы?

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

Ссылка : Энди Страттон (Его Блог)

мне больше нравится это объяснение

общее правило заключается в том, что блокировщики всплывающих окон будет заниматься, если окно.open или аналогичный вызывается из javascript, который не вызывается прямым действием пользователя. То есть, вы можете вызвать window.открыт в ответ на нажмите кнопку в блокировщик всплывающих окон, но если вы помещаете тот же код в событие таймера, он будет заблокирован. Глубина цепочки вызовов также является фактором - некоторые старые браузеры смотрят только на непосредственного вызывающего абонента, новые браузеры могут немного отступить, чтобы увидеть, был ли вызывающий абонент щелчком мыши и т. д. Держите его как можно более мелким, чтобы избежать всплывающих блокировщиков.

ссылка : dthorpe (имя пользователя переполнения стека)

что мы можем сделать?

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

вы можете прочитать решение, представленное Энди в своем блоге здесь:клик. Если бы мне пришлось написать то, что он объяснил вкратце, я бы прямо сказал, что используйте всплывающие окна для раздела ответа. Энди объясняет, что мы можем использовать windows.open в разделе ответа после того как звонок сразу сделан дальше действие пользователя не будет заблокировано блокировщиками всплывающих окон.

как объяснил xaxxon можно проверить после выполнения windows.open что, если он был заблокирован или нет. Как правило, это то, что делают люди и разработчики, делая любую дополнительную функцию обслуживания, имейте это в виду. Например, я внедрял систему аутентификации цифр twitter. Я использовал для проверки сообщения после сбоя в выполнении всплывающей команды, а затем я мог показать сообщение пользователю, чтобы включить всплывающее окно, но затем Я нашел решение, упомянутое выше. Это делает все более аккуратным и чистым.


используйте этот код, чтобы проверить

var popupBlockerChecker = {check:function(b) {
var a = this;
b ? /chrome/.test(navigator.userAgent.toLowerCase()) ? setTimeout(function()      {
a._is_popup_blocked(a, b);
}, 200) : b.onload = function() {
a._is_popup_blocked(a, b);
} : a._displayError();
}, _is_popup_blocked:function(b, a) {
0 == 0 < a.innerHeight && b._displayError();
}, _displayError:function() {
alert("Popup Blocker is enabled! Please add this site to your exception list.");
}};

и использование будет что-то вроде

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

ниже приведено решение jQuery для проверки блокировщика всплывающих окон. Он был протестирован в FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9).

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.co.in", '_blank');
popupBlockerChecker.check(popup);

надеюсь, это поможет.