2012-11-14 10 views
6

アドオンSDKを使用してFirefox拡張機能を開発していて、同じパッケージに別のファイルとして保存されているデータを読み込む必要があります。 .json "スクリプトsrcタグを使用して「panel.html」に含まれるページスクリプト、つまり「loader.js」からロードする必要があります。JSONファイルをFirefoxアドオンページにロードするスクリプト内のすべてのパッケージ内のスクリプト

構造は、このようなものです:

+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ファイルにデータを保存し、 "からインクルードpanel.html "のスクリプトsrcタグを使用しても問題なく動作しました。しかし、アドオンをMozilla Addonサイトに提出したときには、これを解決するための課題の1つとして、JSONファイルなどの非実行形式を使用して安全性を高める必要があるという問題が修正されました。

"loader.js"はAJAXリクエストを "data.json"にすることができないようです。 (JQuery $ .ajax()呼び出しを使用すると、エラーコード0が返され、エラーコードは返されません)。私が考えていたソリューションは、SDKのrequest()関数を使用してmain.jsから "data.json"何らかの形でそれを "loader.js"というページスクリプトに渡します。しかし、私が理解する限り、最初にコンテンツスクリプトにデータを送信し、そこからページスクリプトにデータを送信する必要があるため、これは複雑なようです。そして、これはページスクリプトがロードされているときに起こる必要があります!もっと実用的な解決策がないのかどうかわからないので、私は混乱しています。ローカルJSONデータをローカルページスクリプトにロードするだけです。

答えて

7

アドオンビルダの例を紹介します。

まず第一に、あなたはデータからJSONファイルをロードし、self.data.loadを使用してそれを解析することができます

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

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

これは同期ロードし、そうではそれは、あなたが頻繁にやりたいものではありませんたとえば、ブラウジングセッションでアドオンがアクティブになった場合にのみ発生します。

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

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

:main.jsスクリプトで

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

私は一度だけデータを放出していますことを確認するために余計な作業のビットを行います。データFYIは、my local pubのライブビール樽データAPIから保存されます。

関連する問題