Javascript 修改document.location以打开新选项卡/窗口,而不是当前选项卡中的导航

Javascript 修改document.location以打开新选项卡/窗口,而不是当前选项卡中的导航,javascript,bookmarklet,Javascript,Bookmarklet,我想编写一个bookmarklet来修改任何网页,这样当该网页上的JavaScript代码执行类似于document.location=”的操作时http://site.tld“或document.location.href=”http://site.tld“页面将打开一个新的选项卡或窗口,而不是更改位置;如果代码是窗口,则相同。打开('http://site.tld) 我能否以某种方式修改原型以实现此目标?(我不小心用了这个词,因为虽然我读过几次关于修改原型的书,但我从来没有真正这么做过。)或

我想编写一个bookmarklet来修改任何网页,这样当该网页上的JavaScript代码执行类似于
document.location=”的操作时http://site.tld“
document.location.href=”http://site.tld“
页面将打开一个新的选项卡或窗口,而不是更改位置;如果代码是
窗口,则相同。打开('http://site.tld)


我能否以某种方式修改原型以实现此目标?(我不小心用了这个词,因为虽然我读过几次关于修改原型的书,但我从来没有真正这么做过。)或者有其他方法吗?

你没有说你在使用哪个浏览器,但我能想到的唯一方法是使用Firefox的

这将干预任何设置
document.location
的尝试,打开一个具有相同参数的窗口,然后将赋值改为
“#”
(通常不会执行任何操作)

以bookmarklet形式,并扩展为包括
文档.location
窗口.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对象是
对象的特殊对象。watch
拒绝处理它

如果这还不够,您可以使用
onbeforeuload
在尝试导航离开时提示您并取消它(如果这是您的目标)


我最好的,对不起

只有当原型是函数调用而不是赋值时,才能对其执行操作。例如,在document.write的情况下

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

document.write("test");   

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

使用

window.onbeforeunload = function(e) {
    window.open(document.location.href);
};
将在另一个选项卡中打开当前窗口,并在当前窗口中打开目标。问题在于,onbeforeunload不仅在更改窗口位置时触发,甚至在关闭或刷新窗口时也会触发。取决于你想在哪里使用它

附言:


如果您对此进行测试,当您更改页面位置时,您将能够在地址栏中看到新的url片刻,然后您将被重定向到当前页面。我没能找到新的目标。祝你好运

我打算建议使用ES5,但实际上,document.location是一个“可配置: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...
});

编辑:回答您的问题,我不认为通过bookmarlet可以实现这一点。

FWIW:这在最新的firefox上可以在新选项卡中搜索所选文本:


javascript:Qr=document.getSelection();如果(!Qr){void(Qr=prompt('Keywords…','')};如果(Qr)窗口打开(“+退出(Qr));void(0)

不是一个理想的答案,但是如果没有其他人提供更好的答案,你会得到赏金。仅供参考,
onbeforeunload
没有任何用处,除非我知道在新窗口中打开哪个URL。仅仅停止导航并不是目标。强制创建新选项卡是不正确的。不过还是要谢谢你的提醒,谢谢你。不管怎样,很高兴了解你。理论上,如果可以这样做,是否可以访问新函数中的“原始”文档。位置?从哪个意义上说,您指的是原始文档?上述代码的结果是,当设置location.href(href=“)时,将触发set函数,将.href值设置为所定义的值,并打开一个新窗口。
window.onunload = function() {
    document.location = document.location;
}
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...
});