2013-03-30 23 views
13

Ich schreibe ein Chrome-Plugin mit einem Inhaltsskript und einem Hintergrundskript, und ich versuche, die beiden zu kommunizieren.chrome.runtime.sendMessage funktioniert nicht wie erwartet

In meinem Content-Skript, ich

tue
chrome.runtime.sendMessage({greeting: "hello"}, function(response) { 
     console.log(response.farewell); 
}); 

und in meinem Hintergrund Skript, ich

tue
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     console.log(sender.tab ? 
      "from a content script:" + sender.tab.url : 
      "from the extension"); 
     if (request.greeting == "hello") 
      sendResponse({farewell: "goodbye"}); 
    } 
); 

Mein Manifest sieht wie folgt aus:

{ 
    "manifest_version": 2, 
    "name": "Tesing Phase", 
    "version": "1.0", 
    "background": { 
     "persistent": false, 
     "scripts": ["bgscript.js"] 
    }, 
    "content_scripts": [{ 
     "js": ["contentscript.js"], 
     "all_frames": true, 
     "run_at" : "document_start", 
     "matches": ["*://*/*"] 
    }], 
    "web_accessible_resources": ["script.js"] 
} 

Als ich Führen Sie mein Plugin, ich bekomme den folgenden Fehler:

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 

Ich versuchte Protokollierung chrome.runtime, und es gab keine Methode sendMessage. Ich verwende Version 25.0 von Chromium auf Ubuntu. Ich versuchte auch mit sendRequest, aber es sagte, es ist abgeschrieben und sendMessage sollte verwendet werden.

Kann mir jemand zeigen, was ich hier vermisse? Gibt es irgendwelche Berechtigungen, damit dies funktioniert?

Antwort

34

chrome.runtime.sendMessage/onMessage (und andere damit verbundene Ereignisse/Methoden wie connect) wurden in Chrome 26 eingeführt

Wenn Sie eine Erweiterung schreiben möchten, die mit Chrome 20 kompatibel ist - 25, chrome.extension.sendMessage verwenden.

Eine Möglichkeit, optimale Kompatibilität zu erreichen, besteht darin, die Methoden chrome.runtime selbst zu definieren. Führen Sie beispielsweise den folgenden Code vor dem Rest des Codes (Hintergrund/Content-Skript):

if (!chrome.runtime) { 
    // Chrome 20-21 
    chrome.runtime = chrome.extension; 
} else if(!chrome.runtime.onMessage) { 
    // Chrome 22-25 
    chrome.runtime.onMessage = chrome.extension.onMessage; 
    chrome.runtime.sendMessage = chrome.extension.sendMessage; 
    chrome.runtime.onConnect = chrome.extension.onConnect; 
    chrome.runtime.connect = chrome.extension.connect; 
} 

Dann können Sie einfach die neueste API-Format verwenden:

// Bind event: 
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome.runtime.sendMessage({greeting: 'hello'}); 

Wenn Sie sich unwohl fühlen mit modifizierenden

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ? 
         'runtime' : 'extension'; 

// Bind event: 
chrome[runtimeOrExtension].onMessage.addListener(
    function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'}); 
+2

Dank lot.It mit gearbeitet chrome.extension.I dünn: Methoden auf dem chrome.runtime Objekt können Sie den folgenden Ansatz statt verwenden k Diese Info fehlt in den Google Chrome Dev-Seiten. –

+0

Das sieht gut aus, aber ist diese Methode immer noch gültig für Chromversionen bis 31? oder müsste es angepasst werden? und weiß jemand, ob die alten veralteten Nachrichtenübermittlungsmethoden vollständig aus der neuesten Version von Chrome – user280109

+0

@ user280109 gelöscht wurden. Es ist immer noch gültig. Man könnte aber auch 'chrome.runtime' ohne Kompatibilitätsebenen verwenden, da kaum jemand Chrome 25 verwendet - dank Google's Auto-Updater. –

Verwandte Themen