检测对window.name的更改

时间:2011-03-05 00:57:30

标签: javascript

我正试图找到一种检测窗口名称何时发生变化的好方法。使用setInterval这样很容易:

var old_name = window.name;
var check_name = function() {
    if(window.name != old_name) {
        console.log("window name changed to "+window.name);
        old_name = window.name;
    }
}
setInterval(check_name, 1000);

然而,setInterval不仅有点hacky,而且在检测到更改之前可能会有一个显着的(在这种情况下为1秒)时间延迟。当窗口名称发生变化时,是否有任何类型的事件或聪明的JS可以触发函数?

谢谢! 约瑟夫马斯蒂


编辑:

不幸的是,我无法控制将要更改窗口名称的代码,这在某种程度上是练习的重点。看了evercookie以及其他关于在窗口名称中存储数据的帖子作为跟踪用户的方式,我认为这对我来说并不是真的可以接受。所以,我正在创建一个Greasemonkey脚本(实际上是一个chromemonkey脚本的Chromium版本)来防止这种数据泄漏。

顺便说一下,我确实发现了Chromium实现的一些神奇的功能,这对我想要的东西有很长的路要走。 JS提供了可以像这样使用的魔法getter和setter:

window.__defineSetter__("name", function(nm) { console.log("intercepted window.name attempt: "+nm); });
window.__defineGetter__("name", function() { return ""; }); 

如果我在控制台上运行它,我可以成功劫持窗口名称的集合。但是,将此代码作为Chromium脚本运行(至少我到目前为止尝试过的任何变体)似乎无法覆盖窗口行为。

1 个答案:

答案 0 :(得分:2)

Doesn't look like there is a native event,因此轮询可能是您的唯一选择。

哪段代码更新window.name?你总是可以......

window.name = 'new';
windowNameChanged();