使用JavaScript在新窗口/选项卡(target = _blank)中检测功能

Bri*_*tro 15 javascript browser uiwebview webview feature-detection

根据我的研究:

  • "WebView"可以禁用"在新窗口/选项卡中打开链接".
  • 本机应用程序开发人员使用WebView在其应用程序中显示网页(请参阅Twitter的应用程序).
  • 通过用户代理检测WebView不能始终如一地工作,无论如何都不是最佳实践.
  • 只需尝试使用JS打开一个新窗口就会触发弹出窗口阻止程序; 使它成为一种不可靠的方法来测试是否可以打开一个新窗口.

我需要检测此功能何时不可用.不可能?

附加说明

我正在尝试检测是否可以通过target = _blank打开一个新窗口.例如,UIWebView [应用内浏览器]可以阻止target = _blank按预期工作[它只是在同一个窗口而不是新窗口中打开].我需要一个解决方案来指示由于浏览器限制而无法打开新窗口,例如在UIWebView案例中.不幸的是,弹出窗口阻止程序阻止检查这样的功能,因为它们永远不允许打开新窗口而无需绕过用户输入(即点击).

Cin*_*inn 10

你不会有100%可靠的东西.

只需尝试使用JS打开一个新窗口就会触发弹出窗口阻止程序; 使它成为一种不可靠的方法来测试是否可以打开一个新窗口.

你是对的它绝对不可靠...... window.open()被阻止(即使有类似的技巧window.open(url, '_blank');window.focus();),click()也被阻止(在包含target ="_ blank"的链接上),就像evt = document.createEvent("MouseEvents");evt.initEvent("click", true, true);......

但无论如何:如果WebView不允许在新选项卡中打开链接,那么它将正常工作.但是,正如您所暗示的,Webview可能会对其进行授权.在这种情况下,您将不知道您是否在webview中.很容易检测到新选项卡中的打开链接是否最终打开(可以在非显示的iframe中以javascript进行测试),但如果在浏览器中打开链接,则无法知道(并设想用户体验javascript代码,从应用程序中打开浏览器中的新选项卡...).正如Dave Alperovich所说,如果没有尝试过,你无法提前知道会被阻挡的是什么.所以你不应该看那边.

没有可靠的功能或行为区分Webview和Web浏览器.在webview中,您可以获得浏览器中的所有内容(cookies,WebStorage ...).用户代理有其不完善之处,但在许多情况下都可以使用.有解释这里这里来构建它.


小智 5

根据OP请求我测试了它.它有效.如果弹出窗口阻止程序已启用,我将捕获它,因此我将获得一个可靠的方法来知道它已启用.在这种情况下,我只是发送警报,但你可以做任何你想做的事情.

这是代码:

<!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>
Run Code Online (Sandbox Code Playgroud)

这是我得到的,因为弹出窗口阻止程序已启用.

在此输入图像描述