我正在开发一个Firefox插件,其中包含一个包含一些HTML数据的文件。如何将此文件作为字符串加载?
我能做到
var contents = Components.utils.import("resource://stuff.html");
然后尝试以Javascript的形式执行XML文件。我只想要它的内容!
答案 0 :(得分:10)
使用此功能,您可以读取chrome范围内的文件。
function Read(file)
{
var ioService=Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService);
var scriptableStream=Components
.classes["@mozilla.org/scriptableinputstream;1"]
.getService(Components.interfaces.nsIScriptableInputStream);
var channel=ioService.newChannel(file,null,null);
var input=channel.open();
scriptableStream.init(input);
var str=scriptableStream.read(input.available());
scriptableStream.close();
input.close();
return str;
}
var contents = Read("chrome://yourplugin/stuff.html");
Example loading CSS content and injecting on a page
编辑:
只是为了更新它,因为它有点方便!
let { Cc, Ci } = require('chrome');
function read(file){
var ioService = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
var scriptableStream = Cc["@mozilla.org/scriptableinputstream;1"]
.getService(Ci.nsIScriptableInputStream);
var channel = ioService.newChannel2(file, null, null, null, null, null, null, null);
var input = channel.open();
scriptableStream.init(input);
var str = scriptableStream.read(input.available());
scriptableStream.close();
input.close();
return str;
}
答案 1 :(得分:6)
对于Firefox中的文件系统交互,请使用Mozilla XPCOM组件。 I / O XPCOM组件有一些包装器,例如JSLib和io.js
使用io.js
就像是:
var file = DirIO.get("ProfD"); // Will get you profile directory
file.append("extensions"); // extensions subfolder of profile directory
file.append("{1234567E-12D1-4AFD-9480-FD321BEBD20D}"); // subfolder of your extension (that's your extension ID) of extensions directory
// append another subfolder here if your stuff.xml isn't right in extension dir
file.append("stuff.xml");
var fileContents = FileIO.read(file);
var domParser = new DOMParser();
var dom = domParser.parseFromString(fileContents, "text/xml");
// print the name of the root element or error message
dump(dom.documentElement.nodeName == "parsererror" ? "error while parsing" : dom.documentElement.nodeName);
答案 2 :(得分:4)
答案 3 :(得分:3)
使用可以从任何方案读取的XPCOM的异步解决方案(chrome://,resource://,http://,...):
const Cc = Components.classes;
const Ci = Components.interfaces;
const nsIIOService = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService);
function get_url_async(_url, /* function(data) */ _callback_success, /* function(status) */ _callback_fail)
{
var channel=nsIIOService.newChannel(_url,null,null);
channel.asyncOpen(
{
buffer:null,
onStartRequest: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext)
{
this.buffer = "";
},
onStopRequest: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext, /*in nsresult*/ aStatusCode)
{
if(aStatusCode === Cr.NS_OK)
_callback_success(this.buffer);
else
_callback_fail(aStatusCode);
},
onDataAvailable: function(/*in nsIRequest*/ aRequest, /*in nsISupports*/ aContext, /*in nsIInputStream*/ aInputStream, /*in unsigned long*/ aOffset, /*in unsigned long*/ aCount)
{
var scriptable_in_stream = Cc["@mozilla.org/scriptableinputstream;1"]
.createInstance(Ci.nsIScriptableInputStream);
scriptable_in_stream.init(aInputStream);
this.buffer += scriptable_in_stream.read(aCount);
scriptable_in_stream.close();
}
},
/* context */ null
);
}
用法:
get_url_async(
"resource://stuff.html",
function success(html)
{
// actions with html
},
function fail(status)
{
dump("Cannot get resource://stuff.html status code:"+status);
}
);
答案 4 :(得分:0)
Components.utils.import
用于Javascript代码模块。
如果要使用该命令,则必须将数据存储为JSON。
JSON有点类似于XML,因为它是为数据而设计的,但JSON很容易与Javascript代码集成。
答案 5 :(得分:0)
我认为您正在寻找nsILocalFile。
答案 6 :(得分:0)
对我来说,BunoLM的解决方案有效(感谢一百万!),但只有在将文件url传递给Read函数时才使用“资源”协议,原因explained elsewhere。
我在这里添加它因为我花了一段时间来弄明白这一点,所以希望它会帮助其他人;)