如何创建一个在EventListener设置变量后返回值的函数?

时间:2012-10-07 00:09:21

标签: javascript javascript-events asynchronous callback

我有一个EventListener和一个函数generator.gettext。 代码:

var generator = {
    gettext: function (mytext) {
        //I send a message which is intercepted by my content script. 
        //Later my content script will send a reply back which will be processed by 'receiver'
        window.postMessage({
            type: "MESSAGE",
            text: mytext
        }, "*");
        while (generatedtext == "") {
            //WAIT until generatedtext is set by 'receiver'
        }
        return generator.generatedtext;
    },

    generatedtext: ""
};

function receiver(event) {
    if (event.data.type && (event.data.type == "FROM_CONTENTSCRIPT")) {
        generator.generatedtext = event.data.text;
    }
}
window.addEventListener('message', receiver, false);

我希望generator.gettext返回generator.generatedtext,但我无法让它等到receiver设置它。我的印象是在调用generator.gettext时EventListener被锁定。我必须改变它,因此它变为异步并使用回调参数,但我是新手,并且不知道如何使它工作。有人可以帮帮我吗?

编辑:我想要做的是处理网站上的输入。有一个javascript文件,我希望我的内容脚本处理该输入。我将javascript文件重定向到我硬盘上的修改过的文件。我更改了javascript加载输入的行。当我提交文本时,javascript文件会调用类似var message = generator.gettext(mytext.value);的内容,上面的代码会被注入到页面中,并且必须将mytext发送到我的内容脚本,并且必须返回内容脚本的输出。

1 个答案:

答案 0 :(得分:0)

我想我明白你在问什么,虽然不是很清楚。

您正在发布消息,并且您希望将结果存储在generator.generatedtext上。你已经这样做了。

var generator = {
    generatedtext:'',
    gettext: function (mytext) {
        window.postMessage({
            type: "MESSAGE",
            text: mytext
        }, "*");
    }
};

window.addEventListener('message', function(ev){
    if (event.data.type && (event.data.type == "FROM_CONTENTSCRIPT")) {
        generator.generatedtext = event.data.text;
    }
},false);

除非您尝试做其他用法但尚未明确说明,否则这就是您所需要的。没有必要让generator.gettext()返回任何内容,因为消息事件监听器正在将收到的消息分配给generator.generatedtext。

如果这不是你想要的,请发表评论并提供更多详情,我会尽力帮助你。