Come posso rilevare se un browser è il blocco popup?
-
08-06-2019 - |
Domanda
Di tanto in tanto mi sono imbattuto in una pagina che cerca di pop aprire una nuova finestra (per l'input dell'utente, o qualcosa di importante), ma il blocco popup impedisce che ciò accada.
Quali metodi possono chiamante finestra per assicurarsi che la nuova finestra lanciato correttamente?
Soluzione
Se si utilizza JavaScript per aprire il popup, è possibile utilizzare qualcosa di simile a questo:
var newWin = window.open(url);
if(!newWin || newWin.closed || typeof newWin.closed=='undefined')
{
//POPUP BLOCKED
}
Altri suggerimenti
Ho provato un certo numero di esempi di cui sopra, ma non sono riuscito a farli funzionare con Chrome.Questo semplice approccio sembra funzionare con Chrome 39, Firefox 34, Safari 5.1.7, e IE 11.Ecco il frammento di codice dalla nostra libreria 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.");
}
}
Aggiornamento:Popup esiste da tempi antichi.L'idea iniziale era di mostrare un contenuto senza chiudere la finestra principale.Ora come ora, ci sono altri modi per farlo:JavaScript è in grado di inviare le richieste per il server, in modo che i popup sono raramente utilizzati.Ma a volte sono ancora a portata di mano.
In passato il male, siti abusato popup un sacco.Una brutta pagina potrebbe aprire tonnellate di pop-up di windows con ads.Così ora la maggior parte dei browser tenta di bloccare i popup e proteggere l'utente.
La maggior parte dei browser bloccare i popup se essi sono chiamati fuori di utente attivato gestori di eventi come onclick.
Se ci pensate, è un po ' complicato.Se il codice è direttamente in un onclick di un handler che facile.Ma qual è il popup si apre in setTimeout?
Prova questo codice:
// open after 3 seconds
setTimeout(() => window.open('http://google.com'), 3000);
Il popup si apre in Chrome, ma viene bloccato in Firefox.
...E questo funziona anche Firefox:
// open after 1 seconds
setTimeout(() => window.open('http://google.com'), 1000);
La differenza è che Firefox tratta di un timeout di 2000ms o meno sono accettabili, ma dopo si rimuove la “fiducia”, supponendo che ora è “al di fuori dell'azione da parte dell'utente”.La prima è bloccato, e il secondo non è.
Originale risposta in corrente 2012:
Questa soluzione per il blocco dei popup di controllo è stato testato in FF (v11), Safari (v6), Chrome (v23.0.127.95) & IE (v7 & v9).Aggiornare il displayError funzione per gestire il messaggio di errore, come si vede in forma.
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."); } };
Utilizzo:
var popup = window.open("http://www.google.ca", '_blank'); popupBlockerChecker.check(popup);
Spero che questo aiuta!:)
Una "soluzione" che sempre lavoro a prescindere dal browser azienda o la versione è semplicemente di mettere un messaggio di avviso sullo schermo, da qualche parte vicino al controllo che permetterà di creare un pop-up, che gentilmente avverte l'utente che l'azione richiede un pop-up e, per favore, attivate per il sito.
So che non è fantasia o cosa, ma non si può ottenere qualsiasi più semplice e richiede solo circa 5 minuti di test, quindi si può passare ad altri incubi.
Una volta che l'utente ha permesso di pop-up per il vostro sito, potrebbe anche essere rispettoso, se non esagerate con i pop-up.L'ultima cosa che vuoi fare è infastidire i visitatori.
Ho provato un sacco di soluzioni, ma l'unica che mi potesse venire in mente che anche lavorato con uBlock Origine, è stato utilizzando un timeout per controllare stato chiuso il popup.
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)
}
Ovviamente questo è un hack;come tutte le soluzioni a questo problema.
È necessario fornire abbastanza tempo nella vostra setTimeout per conto iniziale di apertura e di chiusura, in modo che non sta per essere completamente accurata.Sarà una posizione di prova ed errore.
Aggiungi questo alla tua lista di tentativi.
Utilizzando evento onbeforeunload possiamo controllare come segue
function popup()
{
var chk=false;
var win1=window.open();
win1.onbeforeunload=()=>{
var win2=window.open();
win2.onbeforeunload=()=>{
chk=true;
};
win2.close();
};
win1.close();
return chk;
}
si aprirà 2 nero windows in background
la funzione restituisce il valore booleano.
Ho combinato @Kevin B e @DanielB soluzioni.
Questo è molto più semplice.
var isPopupBlockerActivated = function(popupWindow) {
if (popupWindow) {
if (/chrome/.test(navigator.userAgent.toLowerCase())) {
try {
popupWindow.focus();
} catch (e) {
return true;
}
} else {
popupWindow.onload = function() {
return (popupWindow.innerHeight > 0) === false;
};
}
} else {
return true;
}
return false;
};
Utilizzo:
var popup = window.open('https://www.google.com', '_blank');
if (isPopupBlockerActivated(popup)) {
// Do what you want.
}