How to communicate between popup.js and background.js in chrome extension?
Method - A :
Using Long Lived Connections you can communicate from background.js to popup.js of extension page for any activities( Here i have included popup.html and only initiated
sample communication from popup.js as a sample)
background.js
chrome.extension.onConnect.addListener(function(port) {
console.log("Connected .....");
port.onMessage.addListener(function(msg) {
console.log("message recieved" + msg);
port.postMessage("Hi Popup.js");
});
})
popup.js
var port = chrome.extension.connect({
name: "Sample Communication"
});
port.postMessage("Hi BackGround");
port.onMessage.addListener(function(msg) {
console.log("message recieved" + msg);
});
Method - B :
Direct Manipulation of DOM* if your end result is modification of DOM, you can achieve with this
popup.html
<html>
<head>
<script src="popup.js"></script>
</head>
<body>
<div id="x" value="m">Some thing</div>
</body>
</html>
background.js
var views = chrome.extension.getViews({
type: "popup"
});
for (var i = 0; i < views.length; i++) {
views[i].document.getElementById('x').innerHTML = "My Custom Value";
}
Method - C :
Using Long Lived Connections you can communicate from background.js to popup.js of extension page for any activities( Here i have not included popup.html and initiated sample communication from background.js;
background.js
chrome.browserAction.onClicked.addListener(function(tab) {
var port = chrome.extension.connect({
name: "Sample Communication"
});
port.postMessage("Hi BackGround");
port.onMessage.addListener(function(msg) {
console.log("message recieved" + msg);
});
});
I have changed your code and made it running after eliminating some stuff and making it a simple version. Add your code for AJAX requests and HTML DOM on this skeleton( Make sure you add <script>
tag in head section and put chrome.extension.onConnect.addListener
out of (xhr.readyState == 4)
code;)
popup.html
<html >
<head>
<script src="popup.js"></script>
</head>
<body></body>
</html>
manifest.json
{
"name": "Demo",
"version": "1.0",
"manifest_version": 2,
"description": "This is a demo",
"browser_action": {
"default_popup": "popup.html"
},
"background": {
"scripts": ["background.js"]
},
"permissions": ["<all_urls>",
"storage",
"tabs"
]
}
background.js
chrome.extension.onConnect.addListener(function(port) {
console.log("Connected .....");
port.onMessage.addListener(function(msg) {
console.log("message recieved " + msg);
port.postMessage("Hi Popup.js");
});
});
popup.js
var port = chrome.extension.connect({
name: "Sample Communication"
});
port.postMessage("Hi BackGround");
port.onMessage.addListener(function(msg) {
console.log("message recieved" + msg);
});
How do I send a message from the background to a popup in a Chrome extension everytime a page gets loaded?
Technically, chrome.runtime.sendMessage will send a message to all extension pages including the popup, however this is not how the communication should be organized.
Note, the popup is running only when shown so if it's hidden it can't receive messages.
Assuming the popup is already visible, the solution is usually to simply wait for the background script's response using return true
.
popup.js sends a message:
chrome.runtime.sendMessage({foo: 'bar'}, response => {
// use the response here
});
background script:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.foo === 'bar') {
doSomeProcessing(msg).then(sendResponse);
return true;
}
});
function doSomeProcessing(msg) {
return new Promise(resolve => {
// do something async
resolve({data: 123});
});
}
How to communicate between popup page and background page and store the info that I already get?
For question #1, since the background page and popup page both live in extension process, they can communicate with each other directly like setting variables or calling functions. You could check the following two posts:
- How to communicate between popup.js and background.js in chrome extension?
- How to interact with background.js from the popup?
As for question #2,
- After learning how to communicate between popup page and background page, you can save the info retrieved from popup page in background page, and remember to set
persistent: true
inmanifest.json
, it will ensure the background page lives through the whole extension life. - You can also use chrome.storage or localStorage api to store the data. You can save the data in one page and feel free to access it in another page (So this will be also a way to communicate between two pages to some degree)
Related Topics
How to Reset <Input Type = "File">
Fix Node Position in D3 Force Directed Layout
Why Does JavaScript Hoist Variables
Finding Longest String in Array
Reactjs Setstate() with a Dynamic Key Name
Correct Way to Handle Conditional Styling in React
Finding Element's Position Relative to the Document
React.Js: Onchange Event for Contenteditable
Mobile Safari: JavaScript Focus() Method on Inputfield Only Works with Click
Retrieving Binary File Content Using JavaScript, Base64 Encode It and Reverse-Decode It Using Python
Onclick Event Not Firing on Jsfiddle.Net
Firefox 'Cross-Origin Request Blocked' Despite Headers
How to Add Many Functions in One Ng-Click
Firefox Error Rendering an Svg Image to HTML5 Canvas with Drawimage
How to Consume Http Component Efficiently in a Service in Angular 2 Beta
Componentdidmount Equivalent on a React Function/Hooks Component