sendMessage từ nền của tiện ích mở rộng hoặc tập lệnh bật lên tới nội dung không hoạt động


87

Tôi biết rằng câu hỏi đó đã được hỏi nhiều lần theo nhiều cách khác nhau, nhưng tôi đã cố gắng xem qua tất cả các câu trả lời (hy vọng rằng tôi không bỏ sót ai) và không có câu nào phù hợp với tôi.

Đây là mã của tiện ích mở rộng của tôi:

rõ ràng:

{
"name": "test",
"version": "1.1",
"background": 
{ 
    "scripts": ["contextMenus.js"]
},

"permissions": ["tabs", "<all_urls>", "contextMenus"],

"content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js": ["jquery-1.8.3.js", "jquery-ui.js"],
        "css": [ "jquery-ui.css" ],
        "js": ["openDialog.js"]
    }
],

"manifest_version": 2
}

contextMenus.js

function onClickHandler(info, tab) {
    if (info.menuItemId == "line1"){

      alert("You have selected: " + info.selectionText);

      chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});

      alert("Req sent?");

    }
}

chrome.contextMenus.onClicked.addListener(onClickHandler);

chrome.runtime.onInstalled.addListener(function() {

  chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1",     "contexts":["selection"]});

});

openDialog.js

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

  if (msg.action == 'open_dialog_box') {
    alert("Message recieved!");
  }
});

Hai cảnh báo của trang nền hoạt động, trong khi một của content_script thì không.

thông báo của bảng điều khiển log: Lỗi cổng: Không thể thiết lập kết nối. Kết thúc nhận không tồn tại.

Lỗi của tôi ở đâu?


Bạn nên sử dụng chrome.tabs.sendMessage()để gửi tin nhắn đến các kịch bản nội dung, không phải chrome.extension.sendMessage().
apsillers

Câu trả lời:


141

Trong trang nền của bạn, bạn nên gọi

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});  
});

thay vì sử dụng chrome.extension.sendMessagenhư hiện tại.

Các chrome.tabsbiến thể gửi tin nhắn đến các kịch bản nội dung, trong khi chrome.extensionchức năng gửi tin nhắn cho tất cả các thành phần mở rộng khác.


7
Cảm ơn bạn. Điều đó chính xác ngoại trừ việc chrome.tabs.sendMessage phải chỉ định tab nào để gửi nó đến . Vì vậy, giải pháp là thay đổi thành:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Subway

1
Câu trả lời này đã giúp tôi. Cảm ơn rất nhiều vì câu trả lời hữu ích này.
Touhid

13
nên viết gì để nhận trên content-script.js?
Kushal Jain

5
@KushalJain Tôi vừa mới tìm ra điều này. Trong tệp JS script nội dung của bạn, bạn sẽ muốn thêm một trình xử lý sự kiện như sau: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messagelà tham số chứa { action: "open_dialog_box" }hoặc bất cứ thứ gì bạn gửi. senderlà đối tượng chứa ID tiện ích mở rộng Chrome của bạn. sendResponselà tham số chứa function(response) {}hoặc bất kỳ hàm nào bạn truyền vào sẽ được gọi khi thông báo được xử lý.
jsea

5
Giải pháp này đã không làm việc cho tôi. Tôi đang theo dõi chính xác tài liệu Tôi đã sao chép tất cả mã từ developer.chrome.com/extensions/messaging Đây là ví dụ rất đơn giản nhưng không thể hiểu chính xác. Gặp lỗi Không thể thiết lập kết nối. Kết thúc nhận không tồn tại. Bất kỳ ý tưởng nào
umsateesh 14/10 '19

1

@apsillers là đúng. Cũng đừng quên trả về true trong trình nghe kịch bản nội dung của bạn nếu không nó có thể đóng quá sớm.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});

Điều này đã khắc phục sự cố cho tôi - tôi không nhận được phản hồi, nhưng việc thêm vào return trueđã làm cho nó hoạt động.
rupertonline

0

Đây là một ví dụ về tập lệnh nền gửi thông báo đến tệp kịch bản nội dung.

background.js

chrome.tabs.sendMessage(tabs[0].id,"your message"); 

content-script / content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.