Javascript Firefox插件SDK消息传递错误

Javascript Firefox插件SDK消息传递错误,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,我试图在pageMod和内容脚本之间传递消息 我将此代码与pageMod一起使用 var gmailPageMod = pageMod.PageMod({ include: "https://mail.google.com/*", contentScriptWhen: "ready", contentScriptFile: [self.data.url('js/script.js')], conten

我试图在pageMod和内容脚本之间传递消息

我将此代码与pageMod一起使用

var gmailPageMod = pageMod.PageMod({
            include: "https://mail.google.com/*",
            contentScriptWhen: "ready",
            contentScriptFile: [self.data.url('js/script.js')],
            contentStyleFile: [
                self.data.url("css/angular.min.css"),
                self.data.url("css/style.css")
            ],
            onAttach: function(worker) {
                try {
                    console.log("adding worker");
                    gmail_workers.push(worker);
                } catch (error) {
                    console.log("error", error);
                }

                worker.port.on("getTalentGamil_recipient_change", function(email) {
                    console.log(email);
                });
                try {
                    console.log("updating SS");
                    console.log(simpleStorage);
                    worker.port.emit("updateSimpleStorage", simpleStorage);
                } catch (error) {
                    console.log("error", error);
                }

            });
在script.js中

self.port.on("updateSimpleStorage", function(simpleStorage) {
    console.log('updateSimpleStorage from script.js', simpleStorage);
    var e = new CustomEvent('updateSimpleStorage', {
        'detail': simpleStorage
    });
    window.dispatchEvent(e);
});
但是,这会给我一条错误
消息:[异常…“失败”nsresult:“0x80004005(NS\u错误\u失败)”位置:“JS帧::::行0”数据:否]

我不明白为什么?因为我想我做的正是我正在做的。我非常感谢在这件事上的任何帮助

我在这里读到这篇文章-

因此,您从main.js发出以下信息:

worker.port.emit("updateSimpleStorage", simpleStorage);
您想知道为什么它不在
script.js
中调用回调,对吗

以下是我对可能出现的问题的看法:

  • 是否有可能script.js的
    contentScript
    尚未加载
  • 什么是
    simpleStorage
    ?它可以连载吗
  • 如果script.js尚未加载,我建议尝试以下操作:

    main.js
    中的
    onAttach
    中,侦听如下加载事件:

    var gmailPageMod = pageMod.PageMod({
                include: "https://mail.google.com/*",
                contentScriptWhen: "ready",
                contentScriptFile: [self.data.url('js/script.js')],
                contentStyleFile: [
                    self.data.url("css/angular.min.css"),
                    self.data.url("css/style.css")
                ],
                onAttach: function(worker) {
                    try {
                        console.log("adding worker");
                        gmail_workers.push(worker);
                    } catch (error) {
                        console.log("error", error);
                    }
    
                    worker.port.on("getTalentGamil_recipient_change", function(email) {
                        console.log(email);
                    });
    
                    worker.port.on('iLoaded', function() {
                        try {
                            console.log("updating SS");
                            console.log(simpleStorage);
                            worker.port.emit("updateSimpleStorage", simpleStorage);
                        } catch (error) {
                            console.log("error", error);
                        }
                    });
    
                });
    
    self.port.on("updateSimpleStorage", function(simpleStorage) {
        console.log('updateSimpleStorage from script.js', simpleStorage);
        var e = new CustomEvent('updateSimpleStorage', {
            'detail': simpleStorage
        });
        window.dispatchEvent(e);
    });
    
    self.port.emit('iLoaded');
    
    注意我是如何将它包装在一个
    iLoaded
    中的

    然后在
    script.js
    中发出
    iLoaded
    消息,如下所示:

    var gmailPageMod = pageMod.PageMod({
                include: "https://mail.google.com/*",
                contentScriptWhen: "ready",
                contentScriptFile: [self.data.url('js/script.js')],
                contentStyleFile: [
                    self.data.url("css/angular.min.css"),
                    self.data.url("css/style.css")
                ],
                onAttach: function(worker) {
                    try {
                        console.log("adding worker");
                        gmail_workers.push(worker);
                    } catch (error) {
                        console.log("error", error);
                    }
    
                    worker.port.on("getTalentGamil_recipient_change", function(email) {
                        console.log(email);
                    });
    
                    worker.port.on('iLoaded', function() {
                        try {
                            console.log("updating SS");
                            console.log(simpleStorage);
                            worker.port.emit("updateSimpleStorage", simpleStorage);
                        } catch (error) {
                            console.log("error", error);
                        }
                    });
    
                });
    
    self.port.on("updateSimpleStorage", function(simpleStorage) {
        console.log('updateSimpleStorage from script.js', simpleStorage);
        var e = new CustomEvent('updateSimpleStorage', {
            'detail': simpleStorage
        });
        window.dispatchEvent(e);
    });
    
    self.port.emit('iLoaded');
    
    我在这里读这个-

    因此,您从main.js发出以下信息:

    worker.port.emit("updateSimpleStorage", simpleStorage);
    
    您想知道为什么它不在
    script.js
    中调用回调,对吗

    以下是我对可能出现的问题的看法:

  • 是否有可能script.js的
    contentScript
    尚未加载
  • 什么是
    simpleStorage
    ?它可以连载吗
  • 如果script.js尚未加载,我建议尝试以下操作:

    main.js
    中的
    onAttach
    中,侦听如下加载事件:

    var gmailPageMod = pageMod.PageMod({
                include: "https://mail.google.com/*",
                contentScriptWhen: "ready",
                contentScriptFile: [self.data.url('js/script.js')],
                contentStyleFile: [
                    self.data.url("css/angular.min.css"),
                    self.data.url("css/style.css")
                ],
                onAttach: function(worker) {
                    try {
                        console.log("adding worker");
                        gmail_workers.push(worker);
                    } catch (error) {
                        console.log("error", error);
                    }
    
                    worker.port.on("getTalentGamil_recipient_change", function(email) {
                        console.log(email);
                    });
    
                    worker.port.on('iLoaded', function() {
                        try {
                            console.log("updating SS");
                            console.log(simpleStorage);
                            worker.port.emit("updateSimpleStorage", simpleStorage);
                        } catch (error) {
                            console.log("error", error);
                        }
                    });
    
                });
    
    self.port.on("updateSimpleStorage", function(simpleStorage) {
        console.log('updateSimpleStorage from script.js', simpleStorage);
        var e = new CustomEvent('updateSimpleStorage', {
            'detail': simpleStorage
        });
        window.dispatchEvent(e);
    });
    
    self.port.emit('iLoaded');
    
    注意我是如何将它包装在一个
    iLoaded
    中的

    然后在
    script.js
    中发出
    iLoaded
    消息,如下所示:

    var gmailPageMod = pageMod.PageMod({
                include: "https://mail.google.com/*",
                contentScriptWhen: "ready",
                contentScriptFile: [self.data.url('js/script.js')],
                contentStyleFile: [
                    self.data.url("css/angular.min.css"),
                    self.data.url("css/style.css")
                ],
                onAttach: function(worker) {
                    try {
                        console.log("adding worker");
                        gmail_workers.push(worker);
                    } catch (error) {
                        console.log("error", error);
                    }
    
                    worker.port.on("getTalentGamil_recipient_change", function(email) {
                        console.log(email);
                    });
    
                    worker.port.on('iLoaded', function() {
                        try {
                            console.log("updating SS");
                            console.log(simpleStorage);
                            worker.port.emit("updateSimpleStorage", simpleStorage);
                        } catch (error) {
                            console.log("error", error);
                        }
                    });
    
                });
    
    self.port.on("updateSimpleStorage", function(simpleStorage) {
        console.log('updateSimpleStorage from script.js', simpleStorage);
        var e = new CustomEvent('updateSimpleStorage', {
            'detail': simpleStorage
        });
        window.dispatchEvent(e);
    });
    
    self.port.emit('iLoaded');
    

    我发现,根据它,
    CustomEvents
    不再工作,所以我使用了一个带有FF插件SDK本机消息传递的迂回消息传递路由来传递我的信息

    我遇到了,根据它,
    CustomEvents
    不再工作,所以我使用FF插件SDK本机消息传递的迂回消息传递路径来传递我的信息

    非常感谢你的帮助。但是,问题不在于FF本机消息传递。这是
    CustomEvent
    ,显然它已被弃用,不再适用于FF 42。这很有趣@Irtza.QC请链接源代码。也请发布并接受您的解决方案。非常感谢您的帮助。但是,问题不在于FF本机消息传递。这是
    CustomEvent
    ,显然它已被弃用,不再适用于FF 42。这很有趣@Irtza.QC请链接源代码。也请发布并接受您的解决方案。