对于我的Chrome扩展程序,我尝试将所选文本发布到PHP网页。在这个网站上解决的问题(Chrome Extension: how to capture selected text and send to a web service)帮助我实现了这个目标,但我希望以不同的方式发布文本。
我没有提到那里提到的XMLHttpRequest,而是想从内容脚本中发送一个隐藏的JS表单。此方法允许我在将文本导入数据库之前查看或更改文本。
问题是从后台获取触发器到内容脚本。我已经有另一种消息,所以需要使用函数(响应)。但是,在“sendMessage”之外,我无法监听response.cmd。在“sendMessage”中,我无法获得response.cmd来触发函数。除了从后台脚本发送全新消息之外,还有解决方案吗? 我指的代码:
Background.js
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if(request.cmd == "createSelectionMenu") {
sendResponse({cmd: "saveText"}); //Do things
}
});
Content_script.js
chrome.extension.sendMessage({ cmd: "createSelectionMenu", data: selectedText },
function(response) {
if(response.cmd == "saveText") {
createForm();
}
}
});
答案 0 :(得分:1)
我的工作如下:
我会跟踪我打开的标签
内容脚本:
// connect to the background script
var port = chrome.extension.connect();
后台脚本
// a tab requests connection to the background script
chrome.extension.onConnect.addListener(function(port) {
var tabId = port.sender.tab.id;
console.log('Received request from content script', port);
// add tab when opened
if (channelTabs.indexOf(tabId) == -1) {
channelTabs.push(tabId);
}
// remove when closed/directed to another url
port.onDisconnect.addListener(function() {
channelTabs.splice(channelTabs.indexOf(tabId), 1);
});
});
现在,当某个动作发生时,我可以通过我的后台脚本通知我所有注册的标签(即内容脚本):
var notification = { foo: 'bar' };
for(var i = 0, len = channelTabs.length; i < len; i++) {
chrome.tabs.sendMessage(channelTabs[i], notification, function(responseMessage) {
// message coming back from content script
console.log(responseMessage);
});
}
同样,在内容脚本的另一端,您可以在这些消息上添加一个监听器:
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request.foo == 'bar') {
executeStuff();
// if a callback is given:
sendResponse && sendResponse('success');
}
});
这有点像脑筋,因为它在某些地方是多余的。但我最喜欢这种方式,因为你可以把它包起来并使它更容易。
如果您想了解我如何使用此功能,请参阅GitHub上的我的存储库:chrome-extension-communicator。