我有一个Greasemonkey脚本,该脚本使用Javascript对象来维护一些存储的对象。它涵盖了大量信息,但远远少于遇到我的问题之前成功存储和检索的信息。一种价值观拒绝保存,而我无法为自己的一生确定原因。以下问题代码:
适用于要维护的其他较大对象。
目前正在处理的数据总量比以前更少。
不与任何函数或其他对象定义冲突。
可以(可选)在代码启动期间成功将问题存储密钥保存为“ {}”。
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中产生以下输出:
Object {54,10 = Object} //扩展按预期显示了完整的内容,但是有一个奇怪的地方-Firebug用紫色突出显示对象键,而不是匿名对象通常使用黑色。
{“ 54,10”:{“ x”:54,“ y”:10,“ name”:“ Lucky Pheasant”}} //正确字符串化的JSON。
bookmarks_HonoredMule更新了
未定义
我尝试更改对象键的格式,但没有任何效果。进一步缩小问题的范围是,该特定值在代码初始化期间已成功保存为空对象(“ {}”),但是跳过该操作也无济于事。重新加载页面确认非空对象的保存确实失败。
知道什么会导致这种行为吗?我已经彻底探索了达到大小限制的可能性,但似乎并不是问题所在-如前所述,我已经减少了存储使用量。其他较大的对象仍然保存,并且对象总数(已经不高)进一步减少,其数量大于我要在此处存储的数据量。
最佳答案
事实证明,问题是从unsafeWindow上下文调用this.save()的。这是一种安全冲突,但是应该导致抛出访问冲突异常:
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/