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