我正在Linux上的Firefox 24中编写一个简单的插件。
我得到错误:

ReferenceError: TextEncoder is not defined

当我这样做时:var encoder = new TextEncoder();
我正在使用的功能是:
function write_text(filename, text) {
    var encoder = new TextEncoder();
    var data = encoder.encode(text);
    Task.spawn(function() {
       let pfh =  OS.File.open("/tmp/foo", {append: true});
       yield pfh.write(text);
       yield pfh.flush();
       yield pfh.close();
    });
}

最佳答案

嗯,您使用的是SDK,在重新阅读您其他问题的实际错误时,我会进行收集。

  • 您需要从其他模块中显式导入TextEncoder,因为SDK模块缺少该类。
  • 您需要yield OS.File.open。
  • append:仅在Firefox 27+中受支持
  • .flush()仅在Firefox 27+中受支持(无论如何都是一个坏主意)。如果需要,请使用.writeAtomic
  • 您将write: true写入文件。

  • 这是我在Firefox 25(main.js)中测试的完整的有效示例
    const {Cu} = require("chrome");
    // It is important to load TextEncoder like this using Cu.import()
    // You cannot load it by just |Cu.import("resource://gre/modules/osfile.jsm");|
    const {TextEncoder, OS} = Cu.import("resource://gre/modules/osfile.jsm", {});
    const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
    
    function write_text(filename, text) {
        var encoder = new TextEncoder();
        var data = encoder.encode(text);
        filename = OS.Path.join(OS.Constants.Path.tmpDir, filename);
        Task.spawn(function() {
           let file = yield OS.File.open(filename, {write: true});
           yield file.write(data);
           yield file.close();
           console.log("written to", filename);
        }).then(null, function(e) console.error(e));
    }
    
    write_text("foo", "some text");
    

    09-30 16:14
    查看更多