检查弹出窗口拦截器是否启用,当打开新标签页时。

11

我希望在Chrome浏览器中以新的进程/上下文打开新窗口(我不确定是否可以使用window.open函数,但是以下示例可以实现)。如果是一个普通窗口,您可以通过以下示例检查弹出窗口拦截程序是否已启用。

ar newWin = window.open(url);             

if(!newWin || newWin.closed || typeof newWin.closed=='undefined') 
{ 
     //POPUP BLOCKED
}

但我想在没有使用window.open的情况下以新进程打开新窗口,如下所示

var prod = document.getElementById("myElement"); 
var aTag = document.createElement('a');
aTag.setAttribute('href',"http://cnn.com");
//THIS TWO LINES do the job
aTag.setAttribute('rel',"noreferrer");
aTag.setAttribute('target',"_blank");
prod.appendChild(aTag);
aTag.click();
prod.removeChild(aTag);

使用此参考链接:http://news.softpedia.com/news/Force-Google-Chrome-to-Open-Links-in-New-Processes-128962.shtml

如需在新上下文中打开新标签页,请使用以下内容:

  aTag.setAttribute('rel',"noreferrer");
  aTag.setAttribute('target',"_blank");

虽然这样做可以起作用,但有时候新窗口/标签会被弹出拦截器(blocker)屏蔽,我只想知道这一点并在内部通知用户新窗口已被阻止,请启用它...我有哪些选项?

我的要求是:

  1. 在新的进程/上下文中打开窗口
  2. 如果弹出拦截器被阻止则通知用户

如何实现?

更新

我需要这样做,因为当您从现有窗口单击打开新窗口时,第二个窗口被打开,您返回到第一个/源窗口并且想要做某些事情时,它会被阻止!

为了模拟这个问题,您可以创建这个简单的文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>BlockTAB</title>
</head>

<br/>
<br/>
<button onclick="windowOpen('http://cnn.com')">window open native</button>
<br/>
<br/>
<button onclick="windowOpen('http://google.com')">sample</button>

<script>
    function windowOpen(url){
        window.open(url);
    }

</script>
</html>

现在请按以下步骤操作:

  1. 运行程序(即html文件),这将打开CNN选项卡
  2. 检查CNN选项卡并在其上设置断点(在源选项卡中,您可以找到Javascript,请将其放在任何您选择的位置),直到它停止
  3. 现在返回到第一个选项卡,您会发现两个按钮被阻止,您无法进行任何操作,如单击等...

如何在不阻止第一/源选项卡的情况下处理打开新选项卡?

更新2

如果代码未触发弹出拦截器,则有一种方法可以模拟它:

aTag.setAttribute('rel',"noreferrer"); aTag.setAttribute('target',"_blank");

将此代码添加到先前示例中

<script src="https://cdn.jsdelivr.net/bluebird/3.4.5/bluebird.js"></script>
<br/>
<br/>
<button onclick="EnabledPPB('http://cnn.com')">Blocker</button>

function delayFN(url) {
    Promise.delay(500)
        .then(function() {
            var newWin = window.open(url);
        })
}

function EnabledPPB(url) {
    Promise.delay(100)
        .then(function() {
            delayFN(url);
        })

}

为什么你不想使用 window.open 呢?因为它是一个方法调用,它有一个返回值可以检查。点击链接没有任何返回值,因此使用这种方法进行可比较的检查会更加复杂(如果可能的话)。 - CBroe
@guest271314 - 你可以使用我在问题中提供的代码(从var prod = document.getElementById("myElement"); ...),这应该为您打开一个新标签页,但问题是有时这些标签页会被阻止...有什么办法至少通过代码知道这个标签页是否被阻止了吗?我知道当使用window.open时有一种选项可以知道,但这不适用于新进程 :( - user6171746
@guest271314 - 请看我的更新2...谢谢! - user6171746
@guest271314 - 你能看到问题吗?你有什么想法来解决这个问题吗? - user6171746
在打开的窗口上设置断点的目的是什么? - guest271314
显示剩余8条评论
1个回答

2

我不太确定您是想确保打开新窗口还是新进程,因此我会回答两者。

如果您确切地希望Chrome启动一个新进程,那么在Javascript中没有办法做到这一点,即使使用window.open的代码也不行。然而,由于Chrome为每个标签页都打开一个新进程,只要您的用户使用Chrome,就可以安全地假定您的消息在一个新进程中。另一方面,检查您的用户正在使用的浏览器是可能的。虽然您的用户仍然可能伪造用户代理(即浏览器),但对于内部使用来说应该足够了。

更多关于Chrome为每个标签页使用新进程而不是新线程的参考资料。

如果您想确保您的用户在新窗口中打开您的消息,那么使用window.open是唯一的选择。您可以通过添加事件监听器或简单地在HTML中使用onclick属性来触发window.open。仅使用HTML无法实现,当您已经找到使用javascript的方法时,就没有必要再寻找答案了。


请查看我的更新帖子,看看您能否提供帮助,谢谢! - user6171746
我无法重现你的问题,调试器对我来说工作正常(我使用的是 Chrome 53.0.2785.116 m版本)。我猜可能一个更新就能解决这个问题?或者怎么样将你提到的两种方法混合使用呢?首先使用 window.open 检查是否存在弹出窗口阻止(打开一个自动关闭的包含 JavaScript 的页面?),然后使用你的第二种方法打开真正的窗口。 - cytsunny
这非常奇怪,在我们整个团队中都发生了这种情况...我也检查了Chrome Beta、Canary等,这在所有Chrome版本中肯定会发生...你运行程序了吗,点击窗口打开本机,然后在CNN选项卡中放置一个BP,当它停止返回到第一页尝试点击一些按钮,这对你有效吗???我将编辑帖子说明更清楚... - user6171746
你可能忘记刷新标签(打开CNN的那个)直到它停在BP,然后返回第一页并尝试点击某个东西...你能否请尝试一下并告诉我结果? - user6171746
我现在遇到了问题,但你仍然可以使用window.open检查弹出窗口,立即关闭窗口,然后使用你的第二种方法打开真正的窗口,或者直接使用Firefox? - cytsunny
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接