2013-01-15 77 views
14

我想編寫一個小書籤,它將修改任何網頁,以便當該頁面上的JavaScript代碼執行類似document.location = 'http://site.tld'document.location.href = 'http://site.tld'的頁面時打開一個新標籤或窗口而不是改變位置;就好像代碼是window.open('http://site.tld')一樣;修改document.location,以便打開新的選項卡/窗口,而不是在當前選項卡中導航

我可以修改原型來實現這個目標嗎? (我不小心使用了這個詞,因爲儘管我已經閱讀了幾次關於修改原型的內容,但我從來沒有真正做過。)或者有其他方法嗎?

回答

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在您嘗試導航並取消它時提示您(如果這是您的目標)。

最好的我有,抱歉!

+0

不是理想的答案,但如果沒有其他人提供更好的答案,你會得到賞金。僅供參考,'onbeforeunload'是沒有用的,除非我能以某種方式知道在新窗口中打開哪個URL。簡單地停止導航不是目標。強制新標籤是。不過謝謝你提起它。 –

1

如果只是函數調用而不是賦值,那麼只能對原型做些什麼。例如在document.write的情況下

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

document.write("test"); 
2

我試過不同的方法,但幾乎不可能跟蹤目標窗口的href。

使用

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

將在另一個選項卡並在當前窗口中的目標打開你的當前窗口。問題在於onbeforeunload不僅在更改窗口的位置時觸發,即使在關閉窗口或刷新窗口時也是如此。取決於你想使用它的地方。

PS:

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

如果你測試,當您更改頁面位置,你將能夠看到新的URL在了一會兒,然後你會被重定向到當前頁面的地址欄。我沒有設法獲得新的目標。祝你好運!

3

我打算建議使用ES5 Object.defineProperty,但正如它應該的那樣,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實現的。

+0

謝謝你。無論如何,很高興瞭解。理論上,如果可以這樣做,是否有可能訪問新函數中的「原始」document.location? –

+0

在這個意義上你的意思是原始的?使用上述代碼會發生什麼情況是,當設置location.href(href =「http://google.com」)時,set函數會觸發,將.href值設置爲正在定義的值並打開一個新窗口。 – Bruno

-1

FWIW:本工程對最新的Firefox在新標籤來搜索選定的文本:

的javascript:QR = document.getSelection();如果(QR!){無效(QR =提示(」關鍵字...',''))}; if(Qr)window.open(「http://google.com/search?query=」+ escape(Qr)); void(0)

相關問題