Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果从后台发送响应,则在内容脚本中执行函数_Javascript_Background_Google Chrome Extension_Response_Content Script - Fatal编程技术网

Javascript 如果从后台发送响应,则在内容脚本中执行函数

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”中,我无法

对于我的Chrome扩展,我试图将所选文本发布到PHP网页。这个网站上的一个已解决的问题()帮助我实现了这一目标,但我希望以不同的方式发布文本。
与前面提到的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');
  }
});