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

时间:2015-06-04 14:44:13

标签: javascript browser webview uiwebview feature-detection

根据我的研究:

  • “WebView”可以禁用“在新窗口/标签中打开链接”。
  • 原生应用开发者使用WebView在其应用中显示网页(请参阅Twitter的应用)。
  • 通过用户代理检测WebView无法始终如一地工作,无论如何都不是最佳做法。
  • 只需尝试使用JS打开一个新窗口就会触发弹出窗口阻止程序;使它成为一种不可靠的方法来测试是否可以打开一个新窗口。

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

附加说明

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

2 个答案:

答案 0 :(得分: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 ...)。用户代理有其不完善之处,但在许多情况下都可以使用。有解释herehere来构建它。

答案 1 :(得分:5)

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

以下是代码:

match date with
| None ->
    ..... // Part 1
| Some s when s <= aDate -> 
    ..... // repeat Part 1
| _ -> 
    .....

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

enter image description here