如果用户在您的网站上并在新标签页中打开另一个链接(也是您的网站),是否可以将其与用户区别开来?这可以在javascript中,在服务器上,无论如何。
我猜答案是你不能这样做,但我想仔细检查。
答案 0 :(得分:33)
你可以这样做:
if (history.length == 1) { // Um, needs to be 0 for IE, 1 for Firefox
// This is a new window or a new tab.
}
history.length
可能还有其他方式1
,但我不知道它们可能是什么。
答案 1 :(得分:11)
除了JavaScript中的history.length,您还可以读/写窗口的名称。
因此,如果你检查它是否有一个名称onload ...它应该在第一次加载时是空白的...如果你然后将其设置为“foo”...在每个后续在该窗口中加载... window.name属性将返回“foo”...除非您在新的选项卡/窗口中打开一个链接...新窗口应该没有设置名称。
(当然,除非您通过window.open(url,name,features)打开一个弹出窗口;它允许您预先设置名称)
<script>
if(window.name == ''){
//first load (or Nth load in a new Tab/Window)
if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){
//set name so we can catch new Tab/Window
window.name = 'myWinName';
} else {
//we have a new Tab/Window (or something funky)
alert('What?! One window not cool enough for ya?\n' +
'Calling the InterWeb Police!');
}
} else if(window.name == 'myWinName'){
//2nd-Nth load
document.title = 'All is well... we think';
}
</script>
注意事项:
答案 2 :(得分:6)
这是我在ASP.NET MVC中使用的,禁止经过身份验证的用户打开多个标签:
<script language="javascript" type="text/javascript">
@if(Request.IsAuthenticated)
{
<text>
if (window.name != 'singleWindow') {
window.location.href = "Content/ErrorPages/SingleTab.htm";
}
</text>
}
else
{
<text>
window.name = "singleWindow";
</text>
}
</script>
基本上,这会在用户访问登录页面时首次设置窗口名称。登录后,对于每个后续页面加载,将测试窗口名称。
两个问题:
答案 3 :(得分:3)
JavaScript中的window.opener属性将指向打开新窗口的窗口。但是,它不区分新窗口和新选项卡。标签不是官方W3C规范的一部分,因此没有直接支持它们。
答案 4 :(得分:2)
简短的回答是,不。答案很长,如果你正在从你的页面到服务器端方法进行ajaxy调用,那么可以保持打开窗口(在很短的时间内调用)。这将是一个草率,不可靠的混乱,你无法区分新窗口或标签。
答案 5 :(得分:0)
我真的不这么认为。就我所知,最接近的是监控按键和鼠标点击事件,以尝试将操作与在新标签中打开链接的常用方法相匹配。 (即,如果他们在点击或中间点击时持有Command,则可能是新选项卡)。但这并不可靠,因为任何绑定都可以改变。
答案 6 :(得分:0)
这是客户行为,所以我认为你可以用javascript做一些事情,比如查看浏览器历史记录,但是新标签页和新窗口之间的含糊不清。
除此之外,并非所有浏览器都有标签,并且并非所有浏览器都具有与标签相同的含义(在某些过程中是不同的过程,在某些其他过程中它们不是)。
但是,你为什么要检查?如果您的应用程序是在新标签中执行,那真的很重要吗?我不这么认为......