【问题标题】:Greasemonkey & global variablesGreasemonkey 和全局变量
【发布时间】:2010-07-23 20:08:37
【问题描述】:

我是 JavaScript 和 Greasemonkey 的菜鸟,我想写一个简单的脚本。

我知道 Greasemonkey 使用匿名函数包装您的代码,因此您的变量在离开当前页面后将不存在。但是,我需要一个全局变量。 我尝试使用类似这样的 unsafeWindow 和 window 对象:

if (window.myVar == undefined) {
   window.myVar = "myVar";
}

如果我刷新页面,条件的值始终为真。

有没有办法在 Greasemonkey 中使用全局变量?

【问题讨论】:

    标签: javascript greasemonkey userscripts


    【解决方案1】:

    您必须使用 unsafeWindow 才能创建可用于页面的 javascript 范围的全局变量。

    if (unsafeWindow.myVar == undefined) {
       unsafeWindow.myVar = "myVar";
    }
    

    但是当你刷新页面时你不能期望这个变量存在,因为普通的 javascript 不能那样工作。如果你想在页面加载时保存一些数据,那么我建议你使用GM_setValue & GM_getValue

    【讨论】:

    • 除了字符串、布尔值和数字之外,还有什么方法可以跨多个页面保存变量(如 GM_setValue 和 GM_getValue)?我看到了一个 Greasemonkey 的脚本,它可以做到这一点,但我不记得是哪一个。
    • 将对象反序列化为 JSON,然后在加载变量时对其进行序列化。
    【解决方案2】:

    您正在使用全局变量,但全局变量仅在页面刷新时持续存在,您正在清除所有全局变量。在页面刷新后保存数据的唯一方法是使用 cookie、上传到服务器或 HTML5 存储 API。对于greasemonkey,您可能会想要使用cookie。

    【讨论】:

      【解决方案3】:

      要在 GreaseMonkey 中设置全局变量,请使用 @grant none,否则使用 unsafeWindow,它仅适用于 GreaseMonkey。存在一些安全问题。见http://wiki.greasespot.net/@grant

      【讨论】:

      • 您链接的那个文档页面与您所说的略有矛盾。 @grant none 是默认值,如果需要,必须指定 unsafeWindow
      【解决方案4】:

      如果您尝试通过多次页面刷新来维护变量,则需要将其存储在 cookie 中。

      但是,如果您只想在单个页面范围内使用全局变量:

      var imGlobal;
      (function(){ // Greasemonkey crap...
      ...
      imGlobal = "Totally";
      })();
      alert(imGlobal) // Alerts "Totally"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2022-01-28
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        相关资源
        最近更新 更多