Passing message from background.js to popup.js

后端 未结 4 1387
无人共我
无人共我 2020-12-05 10:12

I\'m trying to implement my own chrome extension on which, on a certain event, create a browser notification and fills the popup with data calculated in background.js

<
相关标签:
4条回答
  • 2020-12-05 10:53

    Use runtime.sendMessage to send messages to background script, and tabs.sendMessage from background to content script.

    Please note that you need to specify tab id:

    chrome.tabs.query({ active: true }, (tabs) => {
        chrome.tabs.sendMessage(tabs[0].id, { greeting: 'hello' }, (response) => {
            console.log(response);
        });
    });
    

    You can find full example and documentation here: https://developer.chrome.com/extensions/messaging#simple

    0 讨论(0)
  • 2020-12-05 11:03

    To solve this you need to first send a handshake message to background.js and then send the actual data from background.js to popup.js For Example: In my case what i did was

    popup.js

    chrome.runtime.sendMessage({data:"Handshake"},function(response){
    	
    			});
    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    	str = JSON.stringify(message.data);
    });

    background.js

    chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    //alert(message.data);
    	chrome.runtime.sendMessage({data:datax},function(response){
    			});
    			});

    What iam trying to do is that as soon as we click on icon the handshake message is sent to the background.js and when it recieves it we can then send the variable or any data whick we wanted to send on popup.js to render it on popup.html.

    0 讨论(0)
  • 2020-12-05 11:06

    These are the two simplest ways I've found to send data from background.js to popup.js:

    1) Using storage

    Save values into storage and once popup gets opened, it gets the values from storage and displays them in the popup.

    background.js

    chrome.storage.sync.set({ 'dataValue1': 'Some data 1.' });
    chrome.storage.sync.set({ 'dataValue2': 'Some data 2.' });
    

    popup.js

    function updatePopup() {
        chrome.storage.sync.get(['dataValue1', 'dataValue2'], function (data) {
            document.getElementById("popupElement1").innerText = data.dataValue1;
            document.getElementById("popupElement2").innerText = data.dataValue2;
        });
    }    
    document.addEventListener('DOMContentLoaded', updatePopup);
    

    popup.html

    <html>    
    <head>
        <script src="popup.js"></script>
    </head>    
    <body>
        <p id="popupElement1"></p>
        <p id="popupElement2"></p>
    </body>    
    </html>
    

    manifest.json

    {
        "name": "Background2popup",
        "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"
        ]
    }
    

    2) Using chrome.runtime.sendMessage()

    Once popup opens, you send a message from popup to background to establish the connection/handshake (otherwise, you would get a 'Unchecked runtime.lastError: Could not establish connection. Receiving end does not exist.' if you try to send a message from background to popup and popup isn't open). Once with the connection established, you use sendResponse from background to send the data you wanted to send to popup in the first place.

    background.js

    chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
        if (request.method == "getStatus") {
            console.log(request.data)
            sendResponse({ method: "peepee", data: "poopoo" })
        }
    });
    

    popup.js

    chrome.runtime.sendMessage({ method: "getStatus", data: "fag" }, function (res) {
        document.getElementById("popupElement1").innerText = res.method;
        document.getElementById("popupElement2").innerText = res.data;
    return true;
    });
    

    popup.html & manifest.json are the same as in the first example

    0 讨论(0)
  • Popup doesn't have tab id so you will get the error.

    You can use chrome.runtime.sendMessage and chrome.runtime.onMessage.addListener in that case.

    So in background.js

    chrome.runtime.sendMessage({
        msg: "something_completed", 
        data: {
            subject: "Loading",
            content: "Just completed!"
        }
    });
    

    And in popup.js

    chrome.runtime.onMessage.addListener(
        function(request, sender, sendResponse) {
            if (request.msg === "something_completed") {
                //  To do something
                console.log(request.data.subject)
                console.log(request.data.content)
            }
        }
    );
    

    I hope it would be helpful to you.

    Thanks,

    0 讨论(0)
提交回复
热议问题