14

我想编写一个可以修改任何网页的书签,以便当该页面上的 JavaScript 代码执行类似操作document.location = 'http://site.tld'document.location.href = 'http://site.tld'页面将打开一个新选项卡或窗口而不是更改位置时;就像代码一样window.open('http://site.tld')

我可以以某种方式修改原型来实现这个目标吗?(我用这个词很粗心,因为虽然我读过几次关于修改原型的文章,但我从来没有真正做过。)或者还有其他方法吗?

4

5 回答 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; 位置对象是一些Object.watch拒绝工作的特殊事物。

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

我有最好的,对不起!

于 2013-01-18T02:24:36.447 回答
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...
});

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

于 2013-01-24T04:28:33.643 回答
2

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

使用

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

将在另一个选项卡中打开您当前的窗口,并在当前窗口中打开目标。问题是 onbeforeunload 不仅会在更改窗口位置时触发,甚至在关闭窗口或刷新窗口时也会触发。取决于你想在哪里使用它。

PS:

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

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

于 2013-01-23T11:37:51.560 回答
1

如果原型是函数调用而不是赋值,您只能对原型做一些事情。例如在 document.write 的情况下

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

document.write("test");   
于 2013-01-18T12:16:10.990 回答
-1

FWIW:这适用于最新的 Firefox,以在新选项卡中搜索选定的文本:

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

于 2014-01-06T18:57:36.597 回答