【问题标题】:Greasemonkey failing to GM_setValue()Greasemonkey 未能 GM_setValue()
【发布时间】:2011-02-14 13:46:38
【问题描述】:

我有一个使用 Javascript 对象来维护一些存储对象的 Greasemonkey 脚本。它涵盖了相当大量的信息,但远远少于在遇到我的问题之前成功存储和检索的信息。一个值拒绝保存,我无法为我的生活确定原因。以下问题代码:

  • 适用于正在维护的其他较大对象。
  • 目前处理的数据总量比以前处理的要少。
  • 没有与任何函数或其他对象定义发生冲突。
  • 可以(可选)在代码启动期间成功将问题存储密钥另存为“{}”。
this.save = function(table) {
    var tables = this.tables;
    if(table)
        tables = [table];
    for(i in tables) {
        logger.log(this[tables[i]]);
        logger.log(JSON.stringify(this[tables[i]]));
        GM_setValue(tables[i] + "_" + this.user, JSON.stringify(this[tables[i]]));
        logger.log(tables[i] + "_" + this.user + " updated");
        logger.log(GM_getValue(tables[i] + "_" + this.user));
    }
}

问题始终可以重现,并且日志记录在 Firebug 中产生以下输出:

  1. Object { 54,10 = Object } // 展开会按预期显示完整的内容,但有一个奇怪之处——Firebug 以紫色突出显示对象键,而不是匿名对象的通常黑色。
  2. {"54,10":{"x":54,"y":10,"name":"Lucky Pheasant"}} // 正确字符串化的 JSON。
  3. bookmarks_HonoredMule 已更新
  4. 未定义

我已尝试更改对象键的格式,但没有效果。进一步缩小问题的范围是,在代码初始化期间,此特定值已成功保存为空对象(“{}”),但跳过该值也无济于事。重新加载页面确认非空对象的保存确实失败了。

知道什么会导致这种行为吗?我已经彻底探索了达到大小限制的可能性,但似乎这不是问题——如前所述,我已经减少了存储使用量。其他较大的对象仍然保存,并且已经不高的对象总数进一步减少了比我试图在此处存储的数据量更大的数量。

【问题讨论】:

    标签: javascript greasemonkey local-storage setvalue


    【解决方案1】:

    原来问题在于 this.save() 是从 unsafeWindow 上下文中调用的。这是一种安全违规,但应该导致抛出访问违规异常:

    Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.
    

    相反,GM_setValue 什么也没做就返回,并且随后的日志记录指令也会执行,因此没有任何问题提示,documentation 可能已过期。

    为了通过任何方式解决这个问题,我抽象出 GM_ 存储函数,以便我可以使用其他存储机制,因此解决方法是将所有保存指令放入在 setInterval 中运行的预先存在的清理例程中,类似于上述文档中描述的修复。 (使用现有间隔是为了防止过度创建计时器,这些计时器过去会降低浏览器正常运行时间的性能。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多