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

使用JavaScript在新窗口/选项卡(target=_blank)中检测打开的功能,javascript,browser,webview,uiwebview,feature-detection,Javascript,Browser,Webview,Uiwebview,Feature Detection,根据我的研究: “WebView”可以禁用“在新窗口/选项卡中打开链接” 本地应用程序开发人员使用WebView在其应用程序中显示网页(请参阅Twitter的应用程序) 通过用户代理检测WebView的工作并不一致,也不是一种最佳实践 简单地尝试用JS打开一个新窗口会触发弹出窗口拦截器;这使得测试新窗口是否可以打开变得不可靠 我需要检测此功能何时不可用。不可能 附加说明 我试图检测是否可以通过target=\u blank打开一个新窗口。例如,UIWebView[应用程序内浏览器]可以阻止t

根据我的研究:

  • “WebView”可以禁用“在新窗口/选项卡中打开链接”
  • 本地应用程序开发人员使用WebView在其应用程序中显示网页(请参阅Twitter的应用程序)
  • 通过用户代理检测WebView的工作并不一致,也不是一种最佳实践
  • 简单地尝试用JS打开一个新窗口会触发弹出窗口拦截器;这使得测试新窗口是否可以打开变得不可靠
我需要检测此功能何时不可用。不可能

附加说明


我试图检测是否可以通过target=\u blank打开一个新窗口。例如,UIWebView[应用程序内浏览器]可以阻止target=\u blank按预期工作[它只是在同一窗口而不是新窗口中打开]。我需要一个解决方案来指示何时由于浏览器限制(如UIWebView案例)而无法打开新窗口。不幸的是,弹出窗口拦截器阻止检查此类功能,因为它们从不允许在没有用户输入(即单击)的情况下打开新窗口

你不会有100%可靠的东西

简单地尝试用JS打开一个新窗口会触发弹出窗口拦截器;这使得测试新窗口是否可以打开变得不可靠

你是对的,这绝对不可靠
window.open()
被阻止(即使使用类似于
window.open(url,'u blank');window.focus();
)的技巧,
click()
也被阻止(在包含target=“\u blank”)的链接上),就像
evt=document.createEvent(“MouseEvents”);evt.initEvent(“单击”,真,真)

但是无论如何:如果WebView不允许在新选项卡中打开链接,那么它可以正常工作。但正如您所暗示的,Webview可能会授权它。在这种情况下,您将不知道自己是否在webview中。很容易检测新选项卡中打开的链接是否最终以相同的方式打开(可以在未显示的iframe中使用javascript进行测试),但是如果链接是在浏览器中打开的,您就无法知道(想象一下,用户通过应用程序在浏览器中打开新选项卡的javascript代码体验…)。正如戴夫·阿尔佩罗维奇(Dave Alperovich)所说,如果不尝试,你就无法提前知道什么会被阻止。所以你不应该看那边


没有可靠的功能或行为将Webview与web浏览器区分开来。在网络视图中,您拥有浏览器中的所有内容(cookies、网络存储…)。用户代理有其缺陷,但在许多情况下都能工作。有一些解释或是要构建它。

根据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>

测试弹出窗口拦截器
函数openPopUp(urlToOpen){
var popup_window=window.open(urlToOpen,“myWindow”,“toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizeable=yes,copyhistory=yes,width=400,height=400”);
试一试{
弹出窗口。焦点();
}
捕获(e){
警报(“弹出窗口阻止程序已启用!请将此网站添加到例外列表中。”);
}
}
测试弹出窗口拦截器

这是我得到的,因为弹出窗口拦截器被启用了


那么,您是想检测WebView,还是想确定打开一个新窗口是否有效?或者您试图检测WebView,假设打开一个新窗口对WebView不起作用(这不是真的)?事件侦听器在事件发生后处理安全性。因此,您可以检测webview,可以检测用户代理,甚至可以检查侦听器或查询webview的安全设置,但无法直接查询将被阻止或不被阻止的内容。这并不像库或API存在与否那么简单。@DaveAlperovich难道你不能检查
?@maioman,是的,这是一种合法的检查方法。如果这是绝对的,我不是舒尔,但这样的方法是正确的。OP似乎想要一些更具决定性的东西,比如
if(window.allownew)
——一个“特性检查”,没有什么比这更具决定性的了that@BrianPetro根据你的要求,我对它进行了测试。当它工作时,我把它作为一个答案发表了出来。如果您还需要什么,请告诉我。我正在尝试检测是否可以在没有弹出窗口阻止程序的情况下打开新窗口。例如,UIWebView[应用程序内浏览器]可以阻止target=\u blank按预期工作[它只是在同一窗口而不是新窗口中打开]。我需要此解决方案来指示何时由于浏览器限制(如UIWebView)而无法打开新窗口。不幸的是,弹出窗口拦截器阻止检查此类功能,因为它们不允许在没有用户输入(即点击)的情况下打开新窗口。编辑以包含我能想到的最佳UA检测正则表达式<代码>/(iPhone | iPod | iPad)。*AppleWebKit(?。*Safari)|(Android)。*(wv | AppleWebKit.*版本)/i