为什么保存sendMessage的内容以及如何禁用它?

时间:2014-08-01 20:02:35

标签: javascript google-chrome-extension

我从content.js中的ContextMenu向background.js发送消息。当我发送消息时,我希望看到只有两个变量的警报,这些变量随请求一起发送。当我发送多个请求(连续几次)时,我会收到包括先前发送的消息的警报。似乎所有消息都存储在某个地方。你怎么禁用这个?我希望只看到最近消息的警报。

contents.js:

$(document).mousedown(function(event) {
    var url = window.location.href;
    var contents = window.getSelection().toString();
    switch (event.which) {
        case 3:
            chrome.runtime.sendMessage({contents: contents, url: url}, function(response) {
                //console.log(response.farewell);
            });
            break;
    }
});

background.js

chrome.extension.onMessage.addListener(function (message, sender, sendResponse) {
    if (message.url) {
        chrome.contextMenus.onClicked.addListener(function testFunc2(info, tab){
                alert(message.url);
                alert(typeof message.contents);

            }
        )
    }
});

的manifest.json

"background": {
    "scripts": ["jquery-1.11.1.min.js", "background.js"],
    //"page": "background.html",
    "persistent": true
},

1 个答案:

答案 0 :(得分:2)

这是因为这段代码

chrome.extension.onMessage.addListener(function (message, sender, sendResponse) {
    if (message.url) {
        chrome.contextMenus.onClicked.addListener(function testFunc2(info, tab){
                alert(message.url);
                alert(typeof message.contents);

            }
        )
    }
});

您所说的是每个onMessage事件都会为onClicked事件添加一个侦听器。因此,如果您发送三条消息,最终会有三个testFunc2方法作用于onClicked事件。

因为您尝试使用来自两个不同异步事件的信息。您必须暂时存储其中一个。这样的事情可能会奏效。

var lastMessage;

chrome.extension.onMessage.addListener(function(message, sender, sendResponse) {
     if (message.url) {
         lastMessage = message;
     } else {
         lastMessage = undefined;
     }
});
chrome.contextMenus.onClicked.addListener(function(info, tab) {
    if(lastMessage !== undefined) {
        testFunc2(message, info, tab);
    }
});

function testFunc2(info, tab){
    alert(message.url);
    alert(typeof message.contents);

    // cleanup
    lastMessage = undefined;    
});