我需要从起点跟踪所有用户的浏览器活动。所有起点都分配了唯一的window.name
。
如果用户在新标签页中单击“打开”,我将丢失此唯一标识符以实际跟踪每个起始点。我需要在这两个窗口(孩子和触发孩子的父窗口)之间找到一个关联点。
可以将“在新标签页中打开”作为事件处理,以便我可以附加事件监听器吗?或者还有其他什么解决方案?
答案 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.open
或target="..."
链接打开的,则新窗口将显示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”。