2012-11-14 125 views
6

我一直在使用Addon SDK開發Firefox擴展,並且需要加載一些存儲在同一個包中的數據作爲單獨的文件:「data以.json」。它需要使用腳本src標籤從頁面腳本加載,即「panel.html」中包含的「loader.js」。在Firefox Addon頁面腳本中加載JSON文件,包中的所有內容

的結構是這樣的:

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

panel.html具有:

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

最初我們存儲的數據簡單地成js文件爲 「data.js」 和包括來自「 panel.html「使用腳本src標籤,它工作沒有任何問題。但是,當我們將附加組件提交給Mozilla Addon站點時,這被解決爲需要解決的問題之一,並表示我們需要使用非可執行格式,例如JSON文件以使其更安全。

現在問題看起來像「loader.js」不允許向「data.json」發出AJAX請求。 (使用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')); 

此同步加載,所以它是不是你想經常做的事情,在例如它只會在附加組件firsst在瀏覽會話中變爲活動狀態時纔會發生。

接下來,您將使用內容腳本和消息傳遞將數據傳遞到面板。

在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'); 
}); 

我做一些額外的工作,以確保我只有一次發射數據。數據FYI從my local pub的活啤酒桶數據api中保存。

相關問題