2012-05-03 92 views
0

道歉,如果標題模糊,但它不是最容易描述的問題。目前,如果要在瀏覽器中打包/重載內置函數(例如XmlHttpRequest.prototype.open = function(){return oldOpen(...)}),並且希望在頁面中的任何腳本執行之前執行此操作,則需要使用之前執行的瀏覽器擴展/插件文檔開始被解析。關鍵是,瀏覽器擴展的用戶同意安裝它們的轉換率通常較低。我很樂意能夠使用小書籤來做同樣的事情(Pinterest已經表明小書籤不是他們的障礙!)。但是,可惜的是,booklets按照定義在文檔加載後運行很久。「重新加載」頁面以模仿預加載代碼注入的JS庫?

我想做什麼,我認爲是理論上可能的,是假裝頁面重新加載,但已插入腳本。該過程將如下所示:

  1. 通過XHR從window.location下載原始文檔。
  2. 刪除DOM中的所有元素,包括所有腳本標記。也許會拋出一個不錯的啓動畫面以獲得良好的用戶體驗。
  3. 清除所有超時和時間間隔(在FF和Chrome上ID似乎從1開始計數,因此不需要先驗知識AFAIK)。
  4. 刪除/取消定義windowdocument中的所有密鑰,這些密鑰在空白文檔中不存在...其中,考慮到可能安裝了一些擴展,可能需要一些iframe技巧/消息來實際獲取參考空白文檔。
  5. 將腳本注入到現在空白的文檔中。
  6. 重新插入XHR'd原始文檔中的所有標籤,包括腳本,然後應該在新的上下文中重新加載並重新執行腳本。
  7. 取下閃屏,你很好走!

現在,我會非常樂意嘗試這個,並開放它的源碼,但有沒有人嘗試過這樣的事情?這將是很多工作,我寧願不重新發明輪子,除非我們現在使用的是相當於棍棒上的方形巨石。

+1

我覺得你可以用iframe來實現這一點。 – Hello71

+0

作爲參考,這是項目:https://github.com/bpartridge/angryponies – btown

回答

1

或者用適當的js shim將當前網址重新寫入一個新窗口。

(function() { 

var scriptSrc = 'http://example.com/shim.js'; 
var rq = new XMLHttpRequest; rq.open('get', '', false); 
rq.send(); 
var text = rq.responseText.replace('<head', '<script src="' + scriptSrc + '"></script><head'); 
var win = window.open(); 
win.document.open(); 
win.document.write(text); 
win.document.close(); 

})(); 
+0

哇,我從來沒有料到這個工作!我預計新頁面的起源將是「about:blank」,這意味着跨域請求不起作用,但顯然Chrome(EDIT:和Firefox)將其設置爲原始頁面的來源,並且一切都很好。 – btown

+0

此外,這適用於iframe,以防其他人發現此情況。如果您調整iframe以適合整個頁面,則看起來頁面只是重新加載,但是用墊片! – btown