Подтвердить что ты не робот

API-интерфейс блокировки всплывающих окон - как проверить, включен ли пользователь

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

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

4b9b3361

Ответ 1

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

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

От: 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();
}

Ответ 2

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

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

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

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

Справка: Энди Страттон (его блог)

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

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

Ссылка: dthorpe (Имя пользователя)

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

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

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

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

Ответ 3

window.open() будет только блокироваться, если он не был вызван событием клика.

Чтобы подтвердить, что окно загрузилось:

var loaded = false;

function windowLoaded() { 
  alert("The popup loaded"); 
  loaded = true
}

function pause(milliseconds) {
  var dt = new Date();
  while ((new Date()) - dt <= milliseconds) { /* Do nothing */ }
}

document.write("start...");

//open the window
var win = window.open("window.html");

// If window.open returned an object
if(win) {
  win.onload = function() { 
    win.RunCallbackFunction = windowLoaded; 
  };
  document.write("popup sent...");

  pause(3000);

  // Verify that out window loaded
  if (loaded == false)
    document.write("check you popup blocker!");
  else
    document.write("ok!");

}
else {
  document.write("window.open() was blocked...");
}

Ответ 4

Используйте этот код для проверки

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

Ответ 5

Ниже приведено решение 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);

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