2015-06-04 8 views
15

Nach meinen Recherchen:Eigenschaft erkennt Öffnung in einem neuen Fenster/Tab (target = _blank) mit JavaScript

  • "WebView" kann "öffnen Links in einem neuen Fenster/Tabs" deaktivieren.
  • WebView wird von nativen App-Entwicklern verwendet, um Webseiten innerhalb ihrer App anzuzeigen (siehe App von Twitter).
  • Das Erkennen von WebView über den Benutzeragenten funktioniert nicht konsistent und ist ohnehin keine bewährte Methode.
  • Einfach versuchen, ein neues Fenster mit JS zu öffnen, löst Popup-Blocker aus; Es ist eine unzuverlässige Methode, um zu testen, ob ein neues Fenster geöffnet werden kann.

Ich muss erkennen, wenn diese Funktion nicht verfügbar ist. Unmöglich?

Zusätzliche Erklärung

Ich versuche zu erkennen, ob ich ein neues Fenster über target = _blank öffnen kann. Zum Beispiel kann UIWebView [In-App-Browser] verhindern, dass target = _blank wie erwartet funktioniert [es öffnet sich einfach im selben Fenster anstatt eines neuen]. Ich brauche eine Lösung, um anzuzeigen, wenn ein neues Fenster wegen Browser-Einschränkungen wie im Fall UIWebView nicht geöffnet werden kann. Leider verhindern Popup-Blocker die Überprüfung solcher Funktionen, da sie nie zulassen, dass ein neues Fenster geöffnet wird, ohne dass eine Benutzereingabe (dh ein Klick) umgangen werden muss.

+2

Also, versuchen Sie WebView zu erkennen, oder versuchen Sie, ob, um herauszufinden, um ein neues Fenster zu öffnen funktioniert? Oder versuchen Sie, WebView zu erkennen, vorausgesetzt, dass das Öffnen eines neuen Fensters nie mit WebView funktioniert (was nicht stimmt)? –

+0

@MikhailNaganov Ich möchte nur Feature-Erkennung. –

+2

Ereignislistener behandeln Sicherheit nach einem Ereignis. Sie können also eine Webansicht erkennen, Benutzeragenten erkennen und sogar nach Listenern suchen oder die Webansicht nach Sicherheitseinstellungen abfragen, aber Sie können nicht direkt abfragen, was blockiert werden soll oder nicht. Es ist nicht so einfach wie eine Bibliothek oder API, die vorhanden ist oder nicht. –

Antwort

10

Sie werden nicht zu 100% zuverlässig sein.

Einfach versuchen, ein neues Fenster mit JS zu öffnen, löst Popup-Blocker aus; Es ist eine unzuverlässige Methode, um zu testen, ob ein neues Fenster geöffnet werden kann.

Sie haben Recht, es ist absolut nicht zuverlässig ... window.open() (auch mit einem Trick wie window.open(url, '_blank');window.focus();) blockiert ist, wird click() auch blockiert (auf einem Link-Ziel enthält = „_ blank“), ebenso wie evt = document.createEvent("MouseEvents");evt.initEvent("click", true, true); ..

Aber wie auch immer: wenn das WebView nicht erlaubt, einen Link in einem neuen Tab zu öffnen, dann wird es ok funktionieren. Aber wie Sie vermuten, kann ein Webview es autorisieren. In diesem Fall wissen Sie nicht, ob Sie in einer Webansicht sind oder nicht. Es ist leicht zu erkennen, ob ein geöffneter Link in der neuen Registerkarte schließlich geöffnet ist oder nicht (kann in Javascript in einem nicht angezeigten iframe getestet werden), aber wenn der Link in einem Browser geöffnet wird, haben Sie keine Möglichkeit (und stellen Sie sich die Benutzererfahrung mit einem JavaScript-Code vor, der eine neue Registerkarte im Browser von einer Anwendung öffnet ...). Wie Dave Alperovich sagte, können Sie nicht im Voraus wissen, was blockiert wird oder nicht, ohne es versucht zu haben. Du solltest also nicht auf diese Seite schauen.

Es gibt keine zuverlässigen Funktionen oder Verhaltensweisen, die ein Webview von einem Webbrowser unterscheiden. In einem Webview haben Sie alles, was Sie in einem Browser erhalten (Cookies, WebStorage ...). User Agent hat seine Unvollkommenheiten, aber es funktioniert in vielen Fällen. Es gibt Erklärungen here oder here, um es zu bauen.

+1

Bearbeitet, um den besten UA-Erkennungsregex aufzunehmen, den ich mir vorstellen konnte. '/ (iPhone | iPod | iPad). * AppleWebKit (?!. * Safari) | (Android). * (wv | AppleWebKit. * Version)/i' –

5

Gemäß OP-Anfrage habe ich es getestet. Und es funktioniert. Wenn der Popup-Blocker aktiviert ist, werde ich ihn abfangen und daher werde ich einen zuverlässigen Weg finden zu wissen, dass er aktiviert ist. In diesem Fall sende ich nur eine Warnung, aber Sie können tun, was Sie wollen.Hier

ist der Code:

<!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> 

Und hier ist das, was ich habe, weil der Pop-up-Blocker aktiviert wurde.

enter image description here

+1

Ich versuche herauszufinden, ob ich ein neues Fenster öffnen kann auch ohne den Popup-Blocker. Zum Beispiel kann UIWebView [In-App-Browser] verhindern, dass target = _blank wie erwartet funktioniert [es öffnet sich einfach im selben Fenster anstatt eines neuen]. Ich brauche diese Lösung, um anzuzeigen, wenn ein neues Fenster aufgrund von Browsereinschränkungen wie im Fall von UIWebView nicht geöffnet werden kann. Leider verhindern Popup-Blocker die Überprüfung solcher Funktionen, da sie nie zulassen, dass ein neues Fenster geöffnet wird, ohne dass eine Benutzereingabe (dh ein Klick) umgangen werden muss. –

Verwandte Themen