2015-06-04 27 views
15

Secondo la mia ricerca:Caratteristica rilevare apertura in una nuova finestra/scheda (target = _blank) con JavaScript

  • "WebView" può disabilitare "link si aprono in nuove finestre/schede".
  • WebView viene utilizzato dagli sviluppatori di app nativi per visualizzare pagine Web all'interno della propria app (vedere l'app di Twitter).
  • Rilevare WebView tramite agente utente non funziona in modo coerente e non è comunque una buona pratica.
  • Semplicemente tentando di aprire una nuova finestra con JS attiva i blocchi dei popup; rendendolo un modo inaffidabile per verificare se è possibile aprire una nuova finestra.

Devo rilevare quando questa funzione non è disponibile. Impossibile?

Spiegazione Ulteriori

sto cercando di rilevare se posso aprire una nuova finestra con target = _blank. Ad esempio, UIWebView [browser in-app] può impedire a target = _blank di funzionare come previsto [si apre semplicemente nella stessa finestra anziché in una nuova]. Ho bisogno di una soluzione per indicare quando non è possibile aprire una nuova finestra a causa di limitazioni del browser come nel caso UIWebView. Sfortunatamente i blocchi di popup impediscono di controllare tale funzionalità perché non consentono mai l'apertura di una nuova finestra senza l'input dell'utente (ad es. Un clic) da bypassare.

+2

Quindi, stai cercando di rilevare WebView, o stai cercando di capire se l'apertura di un nuovo stabilimento finestra? O stai cercando di rilevare WebView assumendo che l'apertura di una nuova finestra non funziona mai con WebView (che non è vero)? –

+0

@MikhailNaganov Vorrei solo il rilevamento delle funzioni. –

+2

Gli ascoltatori di eventi gestiscono la sicurezza dopo un evento. In questo modo è possibile rilevare una visualizzazione Web, è possibile rilevare gli agenti utente e si potrebbe persino essere in grado di controllare gli ascoltatori o interrogare la visualizzazione Web sulle impostazioni di sicurezza, ma non è possibile interrogare direttamente ciò che verrà bloccato o meno. Non è così semplice come una libreria o API essere presenti o meno. –

risposta

10

Non avrai nulla di affidabile al 100%.

Semplicemente tentando di aprire una nuova finestra con JS attiva i blocchi dei popup; rendendolo un modo inaffidabile per verificare se è possibile aprire una nuova finestra.

Hai ragione non è assolutamente affidabile ... window.open() è bloccato (anche con un trucco come window.open(url, '_blank');window.focus();), click() è inoltre bloccato (su un link che contiene target = "_ blank"), così come evt = document.createEvent("MouseEvents");evt.initEvent("click", true, true); ..

Ma comunque: se WebView non consente l'apertura di un collegamento in una nuova scheda, funzionerà correttamente. Ma come stai implicando una Webview può autorizzarlo. In questo caso non saprai se sei in una webview o no. È facile rilevare se un link aperto in una nuova scheda è finalmente aperto nello stesso o no (può essere testato in javascript in un iframe non visualizzato), ma se il collegamento viene aperto in un browser, non hai modo di sapere (e immagina l'esperienza dell'utente con un codice javascript che apre una nuova scheda nel browser da un'applicazione ...). Come diceva Dave Alperovich, non puoi sapere in anticipo cosa sarà bloccato o no, senza aver provato. Quindi non dovresti guardare da quella parte.

Non ci sono caratteristiche o comportamenti affidabili che differenziano una Webview da un browser web. In una webview hai tutto ciò che ottieni in un browser (cookie, WebStorage ...). L'agente utente ha le sue imperfezioni ma funzionerà in molti casi. Ci sono spiegazioni here o here per costruirlo.

+1

Modificato per includere la migliore espressione regolare di rilevamento UA che potrei inventare. '/ (iPhone | iPod | iPad). * AppleWebKit (?!. * Safari) | (Android). * (wv | AppleWebKit. * Versione)/i' –

5

Come da OP Richiesta l'ho provato. E funziona. Se il blocco pop-up è abilitato, lo prenderò e quindi avrò un modo affidabile per sapere che è abilitato. In questo caso sto solo inviando un avviso, ma puoi fare tutto ciò che desideri.

Ecco il codice:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Testing Pop-up Blocker</title> 
<script> 
function openPopUp(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."); 
    } 
} 
</script> 
</head> 
<body onload="openPopUp('http://www.google.com'); return false;"> 
<p>Testing Pop-up Blocker</p> 
</body> 
</html> 

Ed ecco quello che ho ottenuto, perché il blocco dei pop-up è stato attivato.

enter image description here

+1

Sto provando a rilevare se posso aprire una nuova finestra anche senza il blocco popup. Ad esempio, UIWebView [browser in-app] può impedire a target = _blank di funzionare come previsto [si apre semplicemente nella stessa finestra anziché in una nuova]. Ho bisogno di questa soluzione per indicare quando non è possibile aprire una nuova finestra a causa di limitazioni del browser come nel caso UIWebView. Sfortunatamente i blocchi di popup impediscono di controllare tale funzionalità perché non consentono mai l'apertura di una nuova finestra senza l'input dell'utente (ad es. Un clic) da bypassare. –