Chrome扩展程序消息传递&执行顺序

时间:2016-06-21 23:32:26

标签: javascript google-chrome-extension message-passing

快速摘要

以下代码是名为 popup.js 的文件。它会侦听单击,并向 background.js 发送消息。 Background.js执行另一个脚本,并创建一个变量。

我不知何故需要将此变量传递回popup.js,并在userHasClicked函数内继续。现在我得到的反应是“未定义”,而且无处可去。

var theParent = document.querySelector("#MENY");
theParent.addEventListener("click", userHasClicked, false);

function userHasClicked(e) {
  if (e.target !== e.currentTarget) {
      var clickedItem = e.target.id;
      chrome.runtime.sendMessage({type: "ResponseType", directive: clickedItem}, function(response) {
        console.log(response);
        this.close();
      });
      };
  e.stopPropagation();
}

例程:

  1. 用户点击popup.html中的选项
  2. 事件(“点击”) - > sendmessage(“点击类型”)
  3. background.js侦听消息,并执行content.js
  4. content.js创建变量并将其发送回任何听取的人。
  5. 问题:

    1. 变量必须作为第2步的响应参数(在eventloop中)
    2. 将响应另存为变量。
    3. document.execCommand( “复制”)。
    4. 完成
    5. 以下代码是background.js的相关部分。

      chrome.runtime.onMessage.addListener(
          function(request, sender, sendResponse) {
              switch (request.type) {
                      case "ResponseType":
                          var LoggType = request.directive;
                          console.log(LoggType)
                          chrome.tabs.executeScript(null, {
                              code: 'var LoggType = "'+LoggType+'";'
                          }, function() {
                              chrome.tabs.executeScript(null, {file:"content.js"});
                          });
                          chrome.runtime.onMessage.addListener(function(req, snd, sndRes) {
                              if (req.type = "LogIsGenerated") {
                                  var Logg = req.directive;
                                  console.log(Logg);
                              } sndRes({});
                          });
                          if (typeof Logg !== "undefined") {
                              alert("Feedback from content.js received");
                              sendResponse({type: "FinalVar", directive: Logg});
                          }
                          else { 
                              alert("No feedback received");
                              sendResponse({});
                          };
                          break};
      
              return true;
          }
      );    
      

      content.js 以此行结尾。

      chrome.extension.sendMessage({type: "LogIsGenerated", directive: Logg});
      

      Logg是包含我想要添加到剪贴板的文本字符串的变量。

      目前,以下代码警告未收到反馈。

                chrome.runtime.onMessage.addListener(function(req, snd, sndRes) {
                          if (req.type = "LogIsGenerated") {
                              var Logg = req.directive;
                              console.log(Logg);
                          } sndRes({});
                      });
                      if (typeof Logg !== "undefined") {
                          alert("Feedback from content.js received");
                          sendResponse({type: "FinalVar", directive: Logg});
                      }
                      else { 
                          alert("No feedback received");
                          sendResponse({});
                      };
      

1 个答案:

答案 0 :(得分:0)

Rob W在此处提供了一个解决方案:Background script can write to clipboard in a very simple manner

工作出色。