uzantı arka planından veya pop-up'tan içerik betiğine sendMessage çalışmıyor


88

Bu sorunun defalarca farklı şekillerde sorulduğunu biliyorum, ancak tüm cevapları gözden geçirmeye çalıştım (umarım kimseyi kaçırmadım) ve hiçbiri benim için işe yaramadı.

Uzantımın kodu:

belirgin:

{
"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!");
  }
});

Arka plan sayfasının iki uyarısı çalışır, ancak content_script'ten biri çalışmaz.

konsol günlüğünün mesajı: Bağlantı noktası hatası: Bağlantı kurulamadı. Alma sonu mevcut değil.

Benim hatam nerede


chrome.tabs.sendMessage()Mesajları içerik betiklerine göndermek için kullanmalısınız , değil chrome.extension.sendMessage().
apsillers

Yanıtlar:


144

Arka plan sayfanızda aramalısınız

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

chrome.extension.sendMessageŞu anda yaptığınız gibi kullanmak yerine .

chrome.tabsOysa varyant, içerik komut mesaj gönderir chrome.extensionfonksiyonu diğer tüm uzantısı bileşenlerine iletileri gönderir.


7
Teşekkürler. Bu, chrome.tabs.sendMessage hangi sekmeye gönderileceğini belirtmesi dışında doğru . Yani çözüm şu şekilde değiştirilecek:chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Metro

1
Bu cevap bana yardımcı oldu. Bu faydalı cevap için çok teşekkürler.
Touhid

13
content-script.js üzerinde almak için ne yazmalı?
Kushal Jain

5
@KushalJain Bunu şimdi anladım. İçerik komut dosyası JS dosyanızda, şuna benzer bir olay dinleyicisi eklemek isteyeceksiniz: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); messageparametresidir { action: "open_dialog_box" }veya ne gönderirseniz gönderin. senderChrome uzantınızın kimliğini içeren bir nesnedir. mesaj işlendikten sonra çağrılmak üzere ilettiğiniz işlevi sendResponseiçeren parametredir function(response) {}.
jsea

6
Bu çözüm benim için işe yaramadı. Dokümantasyonu aynen takip ediyorum, developer.chrome.com/extensions/messaging adresinden tüm kodu kopyaladım Bu çok basit bir örnek ama doğru anlayamadım. Hata alınıyor Bağlantı kurulamadı. Alma sonu mevcut değil. Herhangi bir fikir
umsateesh

4

@apsillers doğru. Ayrıca içerik komut dosyası dinleyicinizde true döndürmeyi unutmayın, aksi takdirde çok erken kapanabilir.

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

Bu benim için sorunu çözdü - yanıt alamıyordum, ancak ekleyerek return trueişe yaradı.
rupertonline

0

İçerik komut dosyasına bir mesaj gönderen bir arka plan komut dosyası örneğini burada bulabilirsiniz.

background.js

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

content-script / content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});

0

Kullanım durumum, bir web sayfasından arka plan komut dosyasına bir mesaj göndermeyi gerektirdi. Kullandığım chrome.runtime.onMessageExternalbu mesajı yakalamak için.

Bu dinleyicinin içinde, temelde mesajı içerik betiğime iletiyordum, böylece işini yapabilecekti, ancak içerik betiğimin onMessage dinleyicisinin mesajı neden yakalayamayacağını anlayamadım.

Mesajı web sayfasından göndermeden önce 1 saniye beklediğimde (temelde yüklerken yapıyordum) içerik komut dosyama isabet eden mesajı görebildim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.