Javascript 如果从后台发送响应,则在内容脚本中执行函数
对于我的Chrome扩展,我试图将所选文本发布到PHP网页。这个网站上的一个已解决的问题()帮助我实现了这一目标,但我希望以不同的方式发布文本。Javascript 如果从后台发送响应,则在内容脚本中执行函数,javascript,background,google-chrome-extension,response,content-script,Javascript,Background,Google Chrome Extension,Response,Content Script,对于我的Chrome扩展,我试图将所选文本发布到PHP网页。这个网站上的一个已解决的问题()帮助我实现了这一目标,但我希望以不同的方式发布文本。 与前面提到的XMLHttpRequest不同,我想从内容脚本发送一个隐藏的JS表单。此方法允许我在将文本导入数据库之前查看或更改文本 问题是如何将触发器从后台转移到内容脚本。我已经有了另一种方式的消息,因此需要使用函数(response)。但是,在“sendMessage”之外,我无法侦听response.cmd。在“sendMessage”中,我无法
与前面提到的XMLHttpRequest不同,我想从内容脚本发送一个隐藏的JS表单。此方法允许我在将文本导入数据库之前查看或更改文本 问题是如何将触发器从后台转移到内容脚本。我已经有了另一种方式的消息,因此需要使用函数(response)。但是,在“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();
}
}
});
我所做的是: 我会记录我打开的标签 内容脚本:
// 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);
});
}
这有点愚蠢,因为它在某些地方是多余的。但我最喜欢这种方式,因为你可以把它包装起来,让它更容易一点
如果您想了解我是如何使用它的,请参阅GitHub上的我的存储库:
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) {
if (request.foo == 'bar') {
executeStuff();
// if a callback is given:
sendResponse && sendResponse('success');
}
});