是否有方法跟踪使用Javascript从哪个window.name打开的新窗口(在新选项卡中打开)?

是否有方法跟踪使用Javascript从哪个window.name打开的新窗口(在新选项卡中打开)?,javascript,browser,dom-events,Javascript,Browser,Dom Events,我需要从一个起点跟踪所有用户的浏览器活动。所有起点都有唯一的窗口。为其指定了名称 如果用户单击新选项卡中的“打开”,我将丢失此唯一标识符以实际跟踪每个起点。我需要在这两个窗口(触发子窗口的子窗口和父窗口)之间找到一个关联 “在新选项卡中打开”是否可以作为事件处理,以便我可以附加事件侦听器?或者还有什么其他解决方案?您已经在下面的评论中澄清了您的问题。您特别询问的是用户右键单击链接并选择“在新选项卡中打开”。(与您设置为在新选项卡中打开的用户单击链接相反,我最初是这样读的。) 最简单、最可靠的方法

我需要从一个起点跟踪所有用户的浏览器活动。所有起点都有唯一的
窗口。为其指定了名称

如果用户单击新选项卡中的“打开”,我将丢失此唯一标识符以实际跟踪每个起点。我需要在这两个窗口(触发子窗口的子窗口和父窗口)之间找到一个关联


“在新选项卡中打开”是否可以作为事件处理,以便我可以附加事件侦听器?或者还有什么其他解决方案?

您已经在下面的评论中澄清了您的问题。您特别询问的是用户右键单击链接并选择“在新选项卡中打开”。(与您设置为在新选项卡中打开的用户单击链接相反,我最初是这样读的。)

最简单、最可靠的方法是修改页面上的链接,将窗口名作为查询字符串参数传递:

var i, list, href;
list = document.getElementsByTagName("a");
for (i = 0; i < list.length; ++i) {
    href = list[i].href;
    if (href.indexOf("?") === -1) {
        href += "?wnd=" + encodeURIComponent(window.name);
    }
    else {
        href += "&wnd=" + encodeURIComponent(window.name);
    }
}
然后在目标页面上:

var sourceWindow = sessionStorage.wndname;
除此之外,你可以给他们一个链接,让他们在一个新选项卡中打开窗口(见下文),但如果他们右键单击链接并说“在新选项卡中打开”,我认为这两个窗口之间没有任何联系。在服务器端,您可以检查REFERER[sic]HTTP头,但我认为没有任何东西是纯客户端的

我是否可以将“在新选项卡中打开”作为事件处理

我认为,当用户在新窗口或选项卡中打开链接时,不会引发任何事件


如果该窗口是通过
window.open
或带有
target=“…”
的链接打开的,则新窗口将有一个
开启器
全局,它是对打开该窗口的窗口的引用。所以,
opener.name

父窗口示例:|

或者通过链接:


请注意,如果您刚刚离开,它会显示“我的开瓶器未设置”。但是,如果您通过上述任一父页面访问,您会看到“我的开场白的名字是parentwin”。

我知道window.open,问题是关于单击“在新选项卡中打开”。“在新选项卡中打开”是否触发window.open?它可以作为事件处理吗?@GeoC.:这取决于浏览器是否在新选项卡或新窗口中打开
。您可以给它提示,但由浏览器来决定。@GeoC:我对答案做了一些修改,使它看起来像是必须通过
窗口打开的。打开
,但它没有打开。带有
目标的链接也同样有效。您不理解我的提问/评论。我知道标签是一个窗口。打开js方法并单击“在新选项卡中打开”是否会触发相同的事件?如果用户单击“在新选项卡/窗口中打开”,我可以得到opener.name吗?@GeoC:我认为你不能,不。你可以给他们一个这样做的链接(见上文),但如果他们右键单击链接并说“在新选项卡中打开”,我认为两者之间没有任何联系。在服务器端,您可以检查
referer
[sic]HTTP头,但我认为没有任何纯粹的客户端。
var sourceWindow = sessionStorage.wndname;
window.name = "parentwin";
document.querySelector('p').onclick = function() {
    window.open("/uTEzowOQ/1");
};
<p><a href="/uTEzowOQ/1" target="_blank">Click me</a></p>
<script>
window.name = "parentwin";
</script>
if (!opener) {
    display("My <code>opener</code> isn't set.");
}
else if (!opener.name) {
    display("<code>opener.name</code> is blank");
}
else {
    display("My opener's name is " + opener.name);
}