2014-09-04 93 views
10

如何知道或检查两个浏览器标签页是否已经打开,如果这些标签页是打开的,用户将收到一个警告框或信息框,说明“URL已经打开”,类似于纯粹/本地JavaScript的?此浏览器选项卡包含一个外部网站,我没有任何操作或更改它的权限。由于如何知道浏览器选项卡是否已经使用Javascript打开?

网址示例

yahoo.com and google.com 

我要提醒用户,如果有对yahoo.com和google.com

已经打开的标签,我想用tabCreate打开URL是这样的:

tabCreate("http://maps.google.com/", "tabMapsPermanentAddress"); 
mean to open a new tab, it is use in creating chrome extension 
+0

'窗口。open()'return'ref'你可以在打开窗口前检查'var windowObjectReference = window.open(strUrl,strWindowName [,strWindowFeatures]);' – Girish 2014-09-04 09:27:35

+0

像这样http://jsfiddle.net/vyhy9wbu/?它会提醒用户该URL已经打开? – User014019 2014-09-04 09:43:21

+1

我想你想看到这样的东西http://jsfiddle.net/vyhy9wbu/1/ – Girish 2014-09-04 10:46:06

回答

7

您可以使用类似以下

<!-- HTML --> 
<a id="opener">Open window</a> 

// JavaScript 
var a = document.getElementById('opener'), w;   
a.onclick = function() { 
    if (!w || w.closed) { 
    w = window.open("https://www.google.com","_blank","menubar = 0, scrollbars = 0"); 
    } else { 
    console.log('window is already opened'); 
    } 
    w.focus(); 
}; 

Working jsBin | More on window.open method

如果你想控制一个以上的窗口,使用下面

<!-- HTML --> 
<a href="https://www.google.com" class="opener">Open google.com</a> | 
<a href="http://www.yahoo.com" class="opener">Open yahoo.com</a> 

//JavaScript 
window.onload = function(){ 
    var a = document.querySelectorAll('.opener'), w = [], url, random, i; 
    for(i = 0; i < a.length; i++){ 
    (function(i){ 
     a[i].onclick = function(e) { 
     if (!w[i] || w[i].closed) { 
      url = this.href; 
      random = Math.floor((Math.random() * 100) + 1); 
      w[i] = window.open(url, "_blank", random, "menubar = 0, scrollbars = 0"); 
     } else { 
      console.log('window ' + url + ' is already opened'); 
     } 
     e.preventDefault(); 
     w[i].focus(); 
     }; 
    })(i); 
    } 
}; 

Working jsBin

片断如果你不希望他们在分开的窗口中加载,只是排除这一行

random = Math.floor((Math.random()*100)+1); 

并删除random参考从下一行

w[i] = window.open(url, "_blank", random, "menubar=0,scrollbars=0"); 

备注:正如您在上面看到的,我们创建了两个带有一些第三方内容的窗口;你应该知道没有办法从他们那里得到任何引用(对父/开窗器的窗口)。

+0

我该如何结合你的代码和这段代码http://jsfiddle.net/jjjs5wd3/3/(由Casey Chu ) – User014019 2014-09-05 05:52:45

+0

我尝试在jsbin中运行你的工作,但似乎没有工作:( – User014019 2014-09-05 06:13:42

+0

我明白了,但是如果我有两个URL,并且我想让用户提醒那些URL已经打开了? – User014019 2014-09-05 06:27:40

4

一个基本的想法是存储在任何一个cookie或localStorage选项卡数,增加它在页面加载和递减它页卸载:

if (+localStorage.tabCount > 0) 
    alert('Already open!'); 
else 
    localStorage.tabCount = 0; 

localStorage.tabCount = +localStorage.tabCount + 1; 
window.onunload = function() { 
    localStorage.tabCount = +localStorage.tabCount - 1; 
}; 

在多个选项卡尝试opening this fiddle

请注意,这种技术是相当脆弱的,但。例如,如果由于某种原因导致浏览器崩溃,卸载处理程序将不会运行,并且它将不同步。

+0

我明白了。你能给我一个在你的代码中使用url的实例吗? – User014019 2014-09-05 05:36:42

+0

与google.com类似,如果打开,它将使用您的代码进行提醒。请参阅更新的问题 – User014019 2014-09-05 05:57:27

+0

我可以将+ localStorage更改为真实的网址吗?像www.google.com? – User014019 2014-09-05 07:41:32

1

answer by Casey Chu工作正常,直到浏览器崩溃打开页面。在任何下次执行时,localStorage对象都将初始化tabCount,其值不为零。因此更好的解决方案是将该值存储在会话cookie中。会话cookie将在浏览器成功退出时被删除。当浏览器崩溃时,会话cookie实际上将被保留,但幸运的是,只有在下一次执行浏览器时才会这样做。

对象sessionStorage对于每个选项卡是不同的,因此它不能用于共享选项卡计数。

这是使用js-cookie库的改进解决方案。

if (+Cookies.get('tabs') > 0) 
    alert('Already open!'); 
else 
    Cookies.set('tabs', 0); 

Cookies.set('tabs', +Cookies.get('tabs') + 1); 

window.onunload = function() { 
     Cookies.set('tabs', +Cookies.get('tabs') - 1); 
}; 
相关问题