打开新标签

时间:2016-09-28 12:50:03

标签: javascript google-chrome chromium referer popup-blocker

我想在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");

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

我的要求是:

  
      
  1. 在新流程/上下文中打开窗口
  2.   
  3. 如果阻止弹出窗口阻止程序通知用户
  4.   

怎么做?

更新

我需要它,因为当您单击从现有窗口打开新窗口并打开第二个窗口并返回第一个/源窗口并且您想要执行某些操作时已阻止!

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

<!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.   
  3. 检查CNN标签并在其上加断点(在源标签中,您可以找到javascript,将其放在您选择的任何地方),直至停止 (您需要刷新页面,直到看到调试器停止...
  4.   
  5. 现在回到第一个标签,两个按钮是,你看到它被阻止了,你不能做点击等等......
  6.   

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

更新2

有一种模拟弹出窗口阻止程序的方法,如果代码没有发生

aTag.setAttribute( '相对', “noreferrer”);   aTag.setAttribute( '目标', “_空白”);

在前面的例子中添加以下代码

<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);
        })

}

1 个答案:

答案 0 :(得分:3)

你不确定是否要确保打开一个新窗口或新进程,所以也许我会回答这两个问题。

如果您确实意味着要确保Chrome启动新流程,则无法在Javascript中执行此操作,甚至无法使用window.open显示的代码。但是,由于Chrome正在为每个标签打开一个新流程,因此只要您的用户使用Chrome,就可以安全地假设您的邮件处于新流程。另一方面,可以检查用户正在使用的浏览器。虽然您的用户仍然可能伪造用户代理(即浏览器),但它应该足以供内部使用。

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

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