1

Javascriptオブジェクトを使用していくつかの保存されたオブジェクトを維持するGreasemonkeyスクリプトがあります。非常に大量の情報をカバーしていますが、問題が発生する前に正常に保存および取得された情報よりも大幅に少なくなっています。1つの値は保存を拒否し、私は一生の間その理由を判断できません。次の問題コード:

  • 維持されている他のより大きなオブジェクトに対して機能します。
  • 現在、以前に処理されていたよりも少ない総量のデータを処理しています。
  • 関数または他のオブジェクト定義と衝突していません。
  • コードの起動時に、問題のあるストレージキーを「{}」として正常に保存できます(オプション)。
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} //展開は期待どおりに完全なコンテンツを表示しますが、奇妙な点が1つあります。Firebugは、匿名オブジェクトの通常の黒ではなく紫でオブジェクトキーを強調表示します。
  2. {"54,10":{"x":54、 "y":10、 "name": "LuckyPheasant"}}//正しく文字列化されたJSON。
  3. ブックマーク_HonoredMuleが更新されました
  4. 未定義

オブジェクトキーの形式を変更してみましたが、効果はありません。問題をさらに絞り込むと、この特定の値はコードの初期化中に空のオブジェクト( "{}")として正常に保存されますが、それをスキップしても役に立ちません。ページをリロードすると、空でないオブジェクトの保存が本当に失敗したことが確認されます。

この動作を引き起こす可能性のあるアイデアはありますか?サイズの制約に達する可能性を徹底的に調査しましたが、問題になる可能性はないようです。前述のように、ストレージの使用量はすでに削減されています。他の大きなオブジェクトはさらに保存され、オブジェクトの総数は、まだ多くはありませんでしたが、ここに保存しようとしているデータの量よりもさらに少なくなっています。

4

1 に答える 1

2

この問題は、 unsafeWindow コンテキストから呼び出された this.save() の問題であることがわかりました。これはセキュリティ違反ですが、アクセス違反の例外がスローされるはずでした:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_getValue.

代わりに GM_setValue は何もせずに戻り、その後のロギング命令も実行されるため、問題のヒントがなく、ドキュメントが古くなっている可能性があります。

何らかの方法でこの問題を解決するために、GM_ ストレージ関数を抽象化して、他のストレージ メカニズムを使用できるようにしました。前述のドキュメントに記載されている修正。(既存の間隔を使用するのは、過去にブラウザーのアップタイムでパフォーマンスが低下したタイマーが過剰に作成されるのを防ぐためです。)

于 2010-05-01T17:11:49.800 に答える