修改document.location,使其在新的标签页/窗口中打开,而不是在当前标签页中导航

15

我想编写一个书签脚本,可以修改任何网页,使得当该页面上的JavaScript代码执行类似 document.location = 'http://site.tld' 或者 document.location.href = 'http://site.tld' 的操作时,网页将在新标签页或窗口中打开,而不是改变位置;就像代码 window.open('http://site.tld') 执行的结果一样。

我是否可以以某种方式修改原型来实现此目标?(我使用这个词有些不谨慎,因为虽然我已经多次阅读过有关修改原型的文章,但我从未真正做过。)还是有其他方法?

5个回答

8

您没有说明使用的浏览器,但我能想到的唯一实现方式是使用Firefox的Object.watch

document.watch('location', function(prop, oldval, newval) {
    window.open(newval);
    return '#';
});

这将干涉任何试图设置document.location的尝试,代之以使用相同的参数打开一个新窗口,然后将赋值更改为'#'(通常不会产生任何效果)。
在书签形式中,扩展以涵盖document.locationwindow.location
javascript:(function(){var handle=function(prop, oldval, newval){window.open(newval); return '#';};document.watch('location',handle);window.watch('location',handle);})();

但是,即使这样也无法阻止对document.location.href的分配; location对象是一些特殊的东西,Object.watch拒绝在其上工作。
如果这还不够,您可以使用onbeforeunload在尝试导航时提示您并取消它(如果这是您的目标)。
这就是我所能提供的最好的建议,抱歉!

不是最理想的答案,但如果没有其他更好的提供,你将获得赏金。FYI,“onbeforeunload”除非我能知道要在哪个URL中打开新窗口,否则它是无用的。仅仅停止导航并不是目标。强制新标签页才是。但还是谢谢你提到它。 - DG.

3

我本来想建议使用ES5 Object.defineProperty,但是像应该的一样,document.location是一个“configurable: false”对象,这意味着它不能被改变。对于好奇的人来说,如果你能改变它,代码会像这样:

Object.defineProperty(document.location, 'href', {
     get: function() { return this.href },
     set: function(value) { this.href = value; window.open(value); return false} //Not sure about this part, but anyways...
});

编辑:回答您的问题,我认为这不可能通过书签实现。


谢谢。无论如何,很高兴了解这个。理论上,如果可能做到这一点,是否可以在新函数内访问“原始”的document.location? - DG.
你的意思是哪一个原始文件?当设置location.href时,上面的代码会发生什么是这样的:set函数将被触发,将.href值设置为正在定义的值并打开一个新窗口。 - Bruno

2
我尝试了不同的方法,但几乎不可能跟踪目标窗口的href。

使用

window.onbeforeunload = function(e) {
    window.open(document.location.href);
};

这段代码会在另一个标签页中打开您当前的窗口,同时在当前窗口中打开目标。问题在于,当改变窗口位置、关闭窗口或刷新窗口时,onbeforeunload 不仅触发,还有一些其他情况也会触发。这取决于您想在哪里使用它。

PS:

window.onunload = function() {
    document.location = document.location;
}

如果你测试这个功能,当你改变页面位置时,你会在地址栏中短暂地看到新的URL,然后你将被重定向回当前页面。我没有成功获取新的目标。祝你好运!


1

如果原型是一个函数调用而不是赋值,那么你只能对其进行某些操作。例如,在 document.write 的情况下。

document.write = function(txt) {
   alert("txt");
};

document.write("test");   

-1

顺便说一句:这在最新的Firefox上可以工作,用于在新标签页中搜索所选文本:

javascript:Qr=document.getSelection();if(!Qr){void(Qr=prompt('Keywords...',''))};if(Qr)window.open("http://google.com/search?query="+escape(Qr));void(0)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接