打开新标签时检查是不是启用了弹出窗口阻止程序

Posted

技术标签:

【中文标题】打开新标签时检查是不是启用了弹出窗口阻止程序【英文标题】:Check if pop-up blocker is enbled when open new tab打开新标签时检查是否启用了弹出窗口阻止程序 【发布时间】:2017-02-06 11:13:26 【问题描述】:

我想在 chrome 中的 new process/context 中打开新窗口,(我不确定 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");

虽然这有效,但有时新窗口/标签会被弹出窗口阻止程序阻止,我只想知道这一点并在内部通知用户新窗口被阻止并请启用它...哪个选项可以我有吗?

我的要求是这样的:

    在新进程/上下文中打开窗口 如果弹出窗口阻止程序被阻止,请通知用户

怎么做?

更新

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

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

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

现在进行以下操作

    运行程序(html 文件),这将打开 CNN 选项卡 检查 CNN 选项卡并在其上放置断点(在源选项卡中您可以找到 javascript,将其放在您选择的任何位置),直到它停止 (您需要刷新页面,直到看到调试器停止... 现在回到第一个选项卡,如果两个按钮都在,您会看到它被阻止,您无法执行单击等操作...

如何处理打开新标签而不阻塞第一个/源标签?

更新 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);
        )


【问题讨论】:

ETag 与此有什么关系?是的,人为触发的链接点击也可以被弹出窗口拦截器捕获 - 这是一件好事,因为否则douchevertisers也会使用这种技术。 @CBroe - 抱歉我的错误这与 Etag 无关...有一种方法可以知道这一点?我只是想从我的代码中知道我可以告诉用户禁用它,这是内部应用程序...\ @CBroe - 除了向用户提供一些信息外,我不想做任何事情,因此当用户单击打开窗口时我需要以某种方式知道这一点...... 那你为什么不想使用window.open呢?由于这是一个方法调用,它有一个可以检查的返回值。单击链接没有任何返回值,因此使用此方法进行可比较的检查会更加复杂(如果可能的话)。 @CBroe - 谢谢,所以有办法使用 window open 在新进程中打开它? 【参考方案1】:

不太确定您是否要确保打开一个新窗口或新进程,所以也许我会同时回答。

如果你的字面意思是你想确保 Chrome 启动一个新进程,那么在 Javascript 中没有办法做到这一点,甚至你用window.open 显示的代码也不行。但是,由于 Chrome 正在为每个选项卡打开一个新进程,因此只要您的用户使用 Chrome,就可以安全地假设您的消息处于一个新进程中。另一方面,检查您的用户正在使用的浏览器是可能的。尽管您的用户可能仍然伪造用户代理(即浏览器),但对于内部使用来说应该足够了。

More reference on Chrome using new process instead of new thread for each tab.

如果您想确保您的用户在新窗口中打开您的消息,带有window.open 的窗口是唯一的选择。您可以通过添加事件侦听器来触发window.open,或者简单地使用HTML 中的onclick 属性。没有办法单独使用 HTML,当您已经找到使用 javascript 的方法时,应该没有理由搜索答案?

【讨论】:

谢谢,这不是解决问题,请参考本文第3段blog.chromium.org/2008/09/multi-process-architecture.html,链接进程阻止源进程做任何操作,我会尽快更新我的帖子更好地解释它。谢谢! 请看我更新的帖子,看看能不能帮忙,谢谢! 对我来说,它似乎与浏览器的行为更相关。浏览器上的 Javascript 几乎无法控制低级行为,例如按进程或线程打开选项卡。如果只是为了调试,那么在这种情况下使用 Firefox 怎么样? 是的,这与 chrome 有关,并且不会在 Firefox 中发生,但我需要找到一些解决 chrome 的方法(因此我标记了 chrome :)),你是否能够在第一页遇到阻塞时调试?我在帖子的请求中输入的代码(带有 noreffer 和空白)解决了它,但我想用它来查找是否启用了弹出窗口阻止程序......任何如何优雅地处理它的想法都会非常有帮助......谢谢! 我无法重现您的问题。调试器对我来说效果很好。 (我正在使用 Chrome 53.0.2785.116 m )。我想也许更新会解决问题?或者混合你提到的两种方法怎么样?使用 window.open 检查是否有弹出块(使用自动关闭的 javascript 打开页面?),然后使用第二种方法打开真实窗口。

以上是关于打开新标签时检查是不是启用了弹出窗口阻止程序的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用弹出窗口阻止程序?

IE8怎么把已经允许弹出的窗口重新阻止该窗口弹出呢?

在新窗口中打开页面而不阻止弹出窗口

JavaScript 在新窗口中打开URL(不触发弹出窗口阻止程序)

在新窗口中打开URL(不触发弹出窗口阻止程序)

script error!是啥意思?