1

我正在编写一个尝试在 Chrome 和 Firefox 中使用的 Greasemonkey 脚本。我知道你不能unsafewindow像在 Firefox 中那样在 Chrome 中使用,所以我一直在尝试使用 jS-uris,比如Greasemonkey、Chrome 和 unsafeWindow.foo()的答案。

当我尝试以下操作时:

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

我收到一条错误消息,显示“tutu”未定义。显然我不明白的是这些变量的范围。我需要为我正在做的事情创建全局函数和变量。我做错了什么?

编辑:实际上我认为问题不是我正在尝试的(除非它是,在这种情况下请告诉我)但是我正在为外观编写脚本的页面与 URLS 混淆,以防止它们去任何东西,但一个相对的 URI。

4

1 回答 1

2

在 Chrome 中,调用后会有延迟location.assign(它们可能在单独的线程中运行),因此当触发并且整个代码抛出异常tutu时,没有定义 var 。alert()(另外,正如 trinity 所说,alert需要以 . 开头javascript:。)

您可以像这样使用计时器:

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

但是,我想你会同意这是一个麻烦的地方。

除了最短/最简单的代码之外,尝试使用页面范围的 javascriptlocation.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);
}
于 2012-11-29T03:20:24.893 回答