6

Addon SDK を使用して Firefox 拡張機能を開発しており、同じパッケージに保存されているデータを別のファイル "data.json" としてロードする必要があります。これは、スクリプトの src タグを使用して「panel.html」に含まれる「loader.js」などのページ スクリプトからロードする必要があります。

構造は次のようになります。

+data
 panel.html
 panel.js
 loader.js
 data.json
 ...
+lib  
 main.js
 ...

panel.html には次のものがあります。

<script type="text/javascript" src="loader.js"></script>

最初は、データを単純に「data.js」として js ファイルに保存し、スクリプト src タグを使用して「panel.html」からインクルードしましたが、問題なく動作しました。しかし、アドオンを Mozilla Addon サイトに提出したとき、これは修正すべき問題の 1 つとして対処され、より安全にするために JSON ファイルなどの非実行形式を使用する必要があると述べられました。

「loader.js」が「data.json」へのAJAXリクエストを行うことが許可されていないようです。(JQuery $.ajax() 呼び出しを使用しても成功せず、エラー コード 0 が返されます) したがって、私が考えている解決策は、SDK の request() 関数を使用して「main.js」から「data.json」をロードすることです。どういうわけかそれをページスクリプトである「loader.js」に渡します。しかし、私が理解している限り、データは最初にコンテンツ スクリプトに送信され、次にそこからページ スクリプトに送信される必要があるため、これは複雑に思えます。これは、ページ スクリプトの読み込み時に発生する必要があります。もっと実用的な解決策がないのか、パッケージ内のローカルJSONデータをローカルページスクリプトにロードするだけで本当に複雑なのか分からないので、私は混乱していますか?

4

1 に答える 1

7

これを調査してアプローチする Add-on Builder の例を次に示します。

まず、データから json ファイルをロードし、self.data.load を使用して解析できます。

let data = require('self').data;

let taps_data = JSON.parse(data.load('taps.json'));

これは同期的に読み込まれるため、頻繁に行う必要はありません。この例では、ブラウジング セッションでアドオンが最初にアクティブになったときにのみ発生します。

次に、コンテンツ スクリプトとメッセージ パッシングを使用して、データをパネルに渡します。

main.js スクリプトでは:

panel.on('show', function() {
    if (!loaded)
        panel.port.emit('taps-data', taps_data);
});

コンテンツ スクリプト内:

self.port.on('taps-data', function(data) {
    $('#list').html('');
    data.forEach(function(item) {
        $('#list').append('<div>'+ item.name +'</div>');
    });
    self.port.emit('taps-loaded');
});

データを 1 回だけ出力するように、少し余分な作業を行います。参考までに、データは私の地元のパブのライブ ビール樽データ API から保存されています。

于 2012-11-15T03:36:30.503 に答える