有没有办法跟踪从哪个window.name打开一个新窗口(在新选项卡中打开)与Javascript?

时间:2014-01-12 08:15:06

标签: javascript browser dom-events

我需要从起点跟踪所有用户的浏览器活动。所有起点都分配了唯一的window.name

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

可以将“在新标签页中打开”作为事件处理,以便我可以附加事件监听器吗?或者还有其他什么解决方案?

1 个答案:

答案 0 :(得分:1)

您已在下面的评论中澄清了您的问题。您是专门询问用户右键单击某个链接并选择“在新标签页中打开”。 (与用户点击设置为在新标签页中打开的链接相反,这是我最初阅读它的方式。)

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

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

然后目标页面只检查location.search中的查询字符串参数。

或者,您可以在用户点击链接时在web session storage中设置一些信息,然后在目标网页上进行检查:

在第一页:

var i, list;
list = document.getElementsByTagName("a");
for (i = 0; i < list.length; ++i) {
    list[i].addEventListener("click", setWindowName, false);
    // If you need to handle IE8, you'll need to do the addEventListener / attachEvent dance
}
function setWindowName() {
    sessionStorage.wndname = window.name;
}

然后在目标页面上:

var sourceWindow = sessionStorage.wndname;

除此之外,你可以给他们一个链接,在他们的新标签页面中打开窗口(见下文),但如果他们右键点击链接并说“打开新的标签,“我不认为两个窗口之间有任何联系。在服务器端,您可以检查REFERER [sic] HTTP标头,但我认为没有任何纯粹的客户端。

  

我可以处理“在新标签中打开”作为活动......

当用户在新窗口或标签页中打开链接时,我不相信会引发任何事件。


如果窗口是通过window.opentarget="..."链接打开的,则新窗口将显示opener全局,这是对打开窗口的窗口的引用。所以,opener.name

父窗口示例:Live Copy | Live Source

window.name = "parentwin";
document.querySelector('p').onclick = function() {
    window.open("/uTEzowOQ/1");
};

或者通过链接:Live Copy | Live Source

<p><a href="/uTEzowOQ/1" target="_blank">Click me</a></p>
<script>
window.name = "parentwin";
</script>

子窗口:Source

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

请注意,如果您只是directly to the child page,则会显示“我的开启者未设置”。但是如果你通过上面的任何一个父页面去那里,你会看到“我的开场白名字是parentwin”。