我从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
},
答案 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;
});