gpt4 book ai didi

javascript - Greasemonkey 无法执行 GM_setValue()

转载 作者:行者123 更新时间:2023-11-30 18:54:15 29 4
gpt4 key购买 nike

我有一个 Greasemonkey 脚本,它使用 Javascript 对象来维护一些存储的对象。它涵盖了相当多的信息,但比遇到我的问题之前成功存储和检索的信息要少得多。一个值拒绝保存,我不能为我的生活确定原因。问题代码如下:

  • 为正在维护的其他更大的对象工作。
  • 目前处理的数据总量比以前少。
  • 不与任何函数或其他对象定义冲突。
  • 可以(可选)在代码启动期间将问题存储 key 成功保存为“{}”。
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 }//Expansion 显示了预期的完整内容,但有一个奇怪之处——Firebug 以紫色突出显示对象键,而不是匿名对象通常的黑色。
  2. {"54,10":{"x":54,"y":10,"name":"Lucky Pheasant"}}//正确字符串化的 JSON。
  3. bookmarks_HonoredMule 已更新
  4. 未定义

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

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

最佳答案

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

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

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

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

关于javascript - Greasemonkey 无法执行 GM_setValue(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2750351/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com