Google chrome extension 如何在chromium extensions中从XHR.OnReadyState内部发布消息?

Google chrome extension 如何在chromium extensions中从XHR.OnReadyState内部发布消息?,google-chrome-extension,Google Chrome Extension,这是我的background.js: Message passing: chrome.extension.onConnect.addListener(function(port) { console.assert(port.name == "knockknock"); port.onMessage.addListener(function(msg) { if (msg.joke == "Knock knock") port.

这是我的background.js:

  Message passing:


  chrome.extension.onConnect.addListener(function(port) {
      console.assert(port.name == "knockknock");
      port.onMessage.addListener(function(msg) {
        if (msg.joke == "Knock knock")
          port.postMessage({question: "Who's there?"});
        else if (msg.answer == "Madame")
          port.postMessage({question: "Madame who?"});
        else if (msg.answer == "Madame... Bovary")
          port.postMessage({question: "I don't get it."});
      });
    });
那么,如何从XHR.onReadyState调用chrome.extension.onConnect.addListener(函数(端口){}),以便在background.js接收到值后将值发送到popup.js


我知道我不能在XHR.onReadyRequest中定义chrome.extension.onConnect.addListener(函数(端口){}。因此,在收到API响应后如何发布消息?

我已经实现了一个示例来说明您的情况,您可以在完成AJAX调用时通知popup.js

manifest.json

background.js

function login(username,password){

    console.log(username);
var xhr = new XMLHttpRequest();

xhr.open("POST", "http://localhost:3000/login/", true);
xhr.setRequestHeader('Content-type','application/json; charset=utf-8');
data = {"username":username,"password":password};
console.log(JSON.stringify(data));
xhr.send(JSON.stringify(data));
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
    console.log(resp);
    var lStorage = localStorage;
    localStorage.setItem("username",resp["username"]);
    localStorage.setItem("apiKey",resp["apiKey"]);
    localStorage.setItem("password",resp["password"]);
    console.log(localStorage.getItem("username"));



  }
};


}
{
  "name": "Demo",
  "description": "Sample Message Communication",
  "version": "1",
  "permissions": [
    "tabs","<all_urls>"
   ],
  "background": {
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_icon": "screen.png",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}
<html>
<head>
<script src="popup.js"></script>
</head>
<body>
</body>
</html>
var port = chrome.extension.connect({name: "Sample Communication"});
port.postMessage("Hi BackGround");
port.onMessage.addListener(function(msg) {
        console.log("message recieved"+ msg);
});

chrome.extension.onMessage.addListener(function (msg,sender,call){
    console.log("Message recieved"+msg);
});
chrome.extension.onConnect.addListener(function(port) {
  console.log("Connected .....");
  port.onMessage.addListener(function(msg) {
        console.log("message recieved "+ msg);
        console.log("mesage"+msg);
        searchquotes();
     });
});
function searchquotes(){
console.log("Inside");
var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function(data) {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
            chrome.extension.sendMessage("Hi popup.js");
            console.log("Response is recieved");
        }
      } else {
        //callback(null);
      }
    }

var url = 'http://www.w3schools.com/html/default.asp';
xhr.open('GET', url, true);
xhr.send();

}
window.onload = searchquotes;