2012-11-29 18 views
1

我正在寫一個Greasemonkey腳本,我試圖在Chrome和Firefox中使用。我知道你不能在Chrome中使用unsafewindow,就像你在Firefox中可以使用的一樣,所以我一直在嘗試使用jS-uris,如下面的答案:Greasemonkey, Chrome and unsafeWindow.foo()Javascript變量在JS URI中的作用域,或者如何編寫頁面作用域對象?

當我嘗試以下方法:

location.assign("javascript:var tutu = 'oscar';"); 
location.assign("alert('1:' + tutu);"); 
alert('2:' + tutu); 

我收到展示了「蓬蓬裙」是未定義的錯誤。很顯然,我不瞭解的是這些變量的範圍。我需要爲我的工作制定全局函數和變量。我沒有正確地做什麼?

編輯:其實我認爲這個問題不是我想要的(除非是這種情況,請告訴我),但是我正在編寫腳本的頁面看起來與URLS混淆,以阻止它們除了相對URI之外,什麼都不做。

回答

2

在Chrome中,location.assign調用(它們可能在單獨的線程中運行)之後有一個延遲,所以tutu var不會在alert()激發並且整個代碼引發異常時定義。 (另外,作爲三位一體表示,alert需要與javascript:來開頭。)

你可以使用一個定時器,像這樣:

location.assign("javascript:var tutu = 'oscar';"); 
setTimeout (
    function() {location.assign("javascript:console.log('1:' + tutu);"); } 
    , 666 
); 

不過,我想你會同意這一點小毛病。

試圖做頁面範圍的JavaScript與location.assign會得到所有,但最短/最簡單的代碼繁瑣。

設置,重置和/或運行很多的頁面範圍使用腳本注入的javascript:

function setPageScopeGlobals() { 
    window.tutu  = 'Oscar'; 
    window.globVar2 = 'Wilde'; 
    window.globVar3 = 'Boyo'; 

    alert ('1:' + tutu); 

    window.useGlobalVar = function() { 
     console.log ("globVar2: ", globVar2); 
    }; 
} 

//-- Set globals 
addJS_Node (null, null, setPageScopeGlobals); 

//-- Call a global function 
addJS_Node ("useGlobalVar();"); 

//-- Standard-ish utility function: 
function addJS_Node (text, s_URL, funcToRun, runOnLoad) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    if (runOnLoad) { 
     scriptNode.addEventListener ("load", runOnLoad, false); 
    } 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 
+0

它的工作原理和它的工作這麼好。我一直在尋找(字面上)日夜。謝謝,非常感謝。 nani gigantum humeris insidentes –

+0

不客氣,樂意效勞。 –