2012-11-14 122 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中保存。

相关问题