web-dev-qa-db-fra.com

API de blocage des fenêtres contextuelles - comment vérifier si l'utilisateur l'a activée

J'ai besoin de savoir quand l'utilisateur clique sur le bouton qui déclenche window.open s'il y a API/chemin stable pour savoir à l'avance si l'utilisateur a activement un bloqueur de pop-up?

Dans certains cas, l'utilisateur ne sait pas/ne fait pas attention à son bloqueur de fenêtres publicitaires (qui bloque la nouvelle fenêtre). Je voudrais les informer par une boîte de dialogue/ou quelque chose pour autoriser une nouvelle fenêtre en cliquant sur autoriser.

22
John Jerrby

Window.open(...) renvoie un handle vers la nouvelle fenêtre si elle existe. S'il n'a pas de poignée pour la nouvelle fenêtre, c'est une assez bonne indication que la fenêtre a été bloquée.

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

De: 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();
}
28
xaxxon

Eh bien, c'est votre question - j'ai besoin d'une solution stable comment savoir quand l'utilisateur clique sur un événement qui ouvre une fenêtre, comment savoir s'il a activé le bloqueur de pop-up . avant l'ouverture de la fenêtre ... merci!

Je crains qu'il n'y ait aucune méthode pour gérer cela. J'ai fait des recherches sur ce même problème il y a quelque temps et je partage ce que j'ai trouvé.

Pourquoi nos popups sont bloqués?

Les bloqueurs de popups intelligents autoriseront un popup s'il est directement associé à l'action d'un utilisateur. S'il est retardé de toute façon, il y a de fortes chances qu'il soit bloqué.

Référence: Andy Stratton (Son blog)

J'aime plus cette explication

La règle générale est que les bloqueurs de popups s'activeront si window.open ou similaire est invoqué à partir de javascript qui n'est pas invoqué par une action directe de l'utilisateur. Autrement dit, vous pouvez appeler window.open en réponse à un clic sur un bouton sans être touché par le bloqueur de fenêtres contextuelles, mais si vous mettez le même code dans un événement de minuterie, il sera bloqué. La profondeur de la chaîne d'appels est également un facteur - certains navigateurs plus anciens ne regardent que l'appelant immédiat, les nouveaux navigateurs peuvent revenir un peu en arrière pour voir si l'appelant de l'appelant était un clic de souris, etc.

Référence: dthorpe (nom d'utilisateur de débordement de pile)

Que pouvons-nous faire?

Une chose est claire: il n'y a aucun moyen direct de Tweak avec des bloqueurs de pop-up à partir du code. Je pense que la raison derrière cela est, cela entravera la seule raison derrière son existence.

Vous pouvez aller lire la solution présentée par Andy sur son blog ici: Cliquez . Si je devais écrire ce qu'il a expliqué en bref, je dirais directement que l'utilisation des popups pour la section réponse. Andy explique que nous pouvons utiliser windows.open dans la section réponse après un appel directement effectué sur l'action de l'utilisateur ne sera pas bloqué par les bloqueurs de popups.

Comme l'explique xaxxon, il est possible de vérifier après l'exécution de windows.open que s'il était bloqué ou non. En général, c'est ce que les gens font et les développeurs tout en faisant une fonctionnalité de service supplémentaire gardent cela à l'esprit. Par exemple, je mettais en œuvre le système d'authentification des chiffres de Twitter. J'avais l'habitude de vérifier le message après l'échec de l'exécution de la commande pop-up, puis je pouvais montrer un message à l'utilisateur pour activer la fenêtre pop-up, mais j'ai trouvé la solution mentionnée ci-dessus. Cela rend le tout plus net et plus propre.

4
Gandalf the White

window.open () ne sera généralement bloqué que s'il n'a pas été déclenché par un événement de clic.

Pour confirmer que la fenêtre a été chargée:

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

Utilisez ce code pour vérifier

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

et l'utilisation sera quelque chose comme

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

Ce qui suit est une solution jQuery pour la vérification des bloqueurs de popups. Il a été testé dans 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.");
    }
};

Usage:-

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

J'espère que cela vous aidera.

2
Swanand