JS URI中的Javascript变量范围,或者如何编写页面范围对象?

时间:2012-11-29 02:14:16

标签: javascript cross-browser greasemonkey scope userscripts

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

当我尝试以下内容时:

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

我收到错误,显示“tutu”未定义。显然我不理解的是这些变量的范围。我需要为我正在进行的工作制作全局函数和变量。我做得不好?

编辑:其实我觉得问题不是我正在尝试的(除非是,在这种情况下请告诉我)但是我正在编写脚本的页面看起来正在弄乱URL以防止它们继续运行除了相对URI之外的任何东西。

1 个答案:

答案 0 :(得分:2)

在Chrome中,location.assign调用后会出现延迟(它们可能在不同的线程中运行),因此tutualert()触发时未定义alert var代码抛出异常。 (另外,正如三位一体所说,javascript:需要以location.assign("javascript:var tutu = 'oscar';"); setTimeout ( function () {location.assign("javascript:console.log('1:' + tutu);"); } , 666 ); 开头。)

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

location.assign

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

尝试使用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); } 执行页面范围javascript对于除最短/最简单代码之外的所有代码都会很麻烦。

使用 脚本注入 设置,重置和/或运行页面范围javascript的 批次 :< / p>

{{1}}