当chrome.runtime.sendMessage
触发contentScript中的事件时,background.js / popup.js无法接收/响应该消息。但是,当我在执行而不是事件时触发内容脚本chrome.runtime.sendMessage
时,popup.js能够响应,但不能响应background.js
manifest.js的相关部分
"background": {
"scripts": "background.js"
},
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["lib/jquery.js", "crop.js"],
"run_at": "document_end"
}],
"browser_action": {
"default_icon": "camera.png",
"default_title": "Take a screen shot!",
"default_popup": "popup.html"
},
"permissions": [
"activeTab"
],
"manifest_version": 2
}
侦听事件的popup.js的相关部分
document.addEventListener('DOMContentLoaded', function() {
initPopup();
chrome.runtime.onMessage.addListener( function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
sendResponse({farewell: "goodbye"});
return true;
});
})
以编程方式注入crop.js(内容脚本)的popup.js的相关部分
function promptCrop() {
chrome.tabs.executeScript({
file: 'lib/jquery.js'
})
chrome.tabs.insertCSS({
file: 'crop.css'
})
chrome.tabs.executeScript({
file: 'crop.js'
})
}
crop.js(contentScript)的相关部分
$(overlay)
.mousedown(function(ev) {
//irrelevant
})
.mousemove(function(ev) {
//irrelevant
})
.mouseup(function(ev) {
isDragging = false;
cropPause(ev);
})
function cropPause(ev) {
cropSelect.end.x = ev.clientX;
cropSelect.end.y = ev.clientY;
chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
console.log('message was sent');
alert(response);
});
}
以上 crop.js 不起作用。消息始终返回undefined。但是,如果在事件之外发送chrome.runtime.sendMessage
,脚本独立的任何地方,popup.js上的eventlistener都可以响应它。