如何从Firefox插件中加载文件

时间:2010-09-22 19:13:04

标签: javascript firefox firefox-addon

我正在开发一个Firefox插件,其中包含一个包含一些HTML数据的文件。如何将此文件作为字符串加载?

我能做到

var contents = Components.utils.import("resource://stuff.html");

然后尝试以Javascript的形式执行XML文件。我只想要它的内容!

7 个答案:

答案 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组件有一些包装器,例如JSLibio.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)

我认为这些链接非常有用...... 这些讲述了如何实现Json以及关于firefox接口的一些东西

http://www.json.org/js.html

https://developer.mozilla.org/en/JSON

希望有所帮助:)

答案 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

我在这里添加它因为我花了一段时间来弄明白这一点,所以希望它会帮助其他人;)