我有一個Greasemonkey腳本,可以在Firefox和Opera中正常工作。但是,我很難使其在Chrome中工作。問題是將一個函數注入頁面,該函數可以由頁面中的代碼調用。到目前為止,這是我正在做的事情:首先,我獲得了針對Firefox 的unsafeWindow的輔助參考。這使我可以為FF和Opera(和Chrome,我認為)具有相同的代碼。var uw = (this.unsafeWindow) ? this.unsafeWindow : window;接下來,我將一個函數注入頁面。實際上,它只是一個非常薄的包裝程序,除了在我的GM腳本的上下文中調用相應的功能外,什么也不做:uw.setConfigOption = function(newValue) { setTimeout(setConfigOption, 0, newValue);}然后,在我的腳本中有相應的功能:setConfigOption = function(newValue) { // do something with it, e.g. store in localStorage}最后,我將一些HTML注入到頁面中,并帶有一個調用該函數的鏈接。var p = document.createElement('p');p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';document.getElementById('injection-point').appendChild(p);總結一下:在Firefox中,當用戶單擊該注入的鏈接時,它將在unsafeWindow上執行函數調用,然后觸發超時,該超時將在我的GM腳本的上下文中調用相應的函數,然后進行實際處理。(如果我錯了,請糾正我。)在Chrome中,我僅收到“ Uncaught ReferenceError:未定義setConfigOption”錯誤。實際上,在控制臺中輸入“ window.setConfigOption”會產生“未定義”。在Firebug和Opera開發者控制臺中,該功能就在那里。也許還有另一種方法,但是我的一些函數是由頁面上的Flash對象調用的,我認為這使我有必要在頁面上下文中使用函數。我快速瀏覽了Greasemonkey Wiki上unsafeWindow的替代方案,但它們看上去都很難看。我是在這里完全走錯了路還是應該更仔細地研究這些?解決方案:我關注了MaxS。建議,并且現在可以在Firefox和Chrome中使用。因為我需要供頁面使用的函數必須調回常規函數,所以我將整個腳本移至了頁面,即,該腳本已完全包裝到他稱為“ main()”的函數中。為了使該hack的額外丑陋更容易忍受,我現在至少可以放棄使用unsafeWindow和wrappedJSObject。我仍然沒有設法使Greasemonkey Wiki 的內容范圍運行器生效。它應該做同樣的事情,看起來似乎執行得很好,但是<a>例如,頁面中的元素永遠無法訪問我的函數。我還沒有弄清楚為什么會這樣。
從Chrome上的Greasemonkey腳本向頁面中注入JS函數
SMILET
2019-12-25 14:06:40