2016-05-16 21 views
0

Ich versuche, eine Nachricht an mein Inhaltsskript aus dem Hintergrund zu senden, zusammen mit der Menü-ID, die geklickt wurde (was jetzt perfekt funktioniert). Nachdem ich similair Fragen betrachtet habe, bin ich dem Führer von Google Developer auf Nachricht gefolgt gegangen here. aber es scheint nicht für mich zu arbeiten, da ich einen uncaught Event-Handler bekomme.Chrome-Plugin - Nachricht an Inhalt senden

Manifest

"permissions": [ 
    "contextMenus", 
    "background", 
    "tabs", 
    "activeTab", 
    "storage", 
    "https://ajax.googleapis.com/" 
], 

"background": { 
    "persistent": false, 
    "scripts": ["scrippy.js"] 
}, 

"content_scripts": [ 
{ 
    "run_at": "document_end", 
    "matches": ["http://*/*", "https://*/*"], 
    "js": ["content.js"] 
} 
] 
} 

Hintergrund

// Create context menu type variable so that its easily changed for all of them 
var type = ["editable"]; 

// Create context menu 
// Parent item 
var scrippyMenu = chrome.contextMenus.create({"id": "1", "title": "Scrippy", "contexts": type}); 

// Child 1 
var menuChild1 = chrome.contextMenus.create({"id": "2", "title": "child1", "parentId": scrippyMenu, "contexts": type}); 

// Child 2 
var menuChild2 = chrome.contextMenus.create(
{"id": "3", "title": "child2", "parentId": scrippyMenu, "contexts": type}); 

// sub child 1 of child 2 
var menuChild3 = chrome.contextMenus.create(
{"id": "4", "title": "sub child", "parentId": menuChild2, "contexts": type}); 

// Create an on click event listener and send message to content.js 
chrome.contextMenus.onClicked.addListener(function(info, tab) { 

//check menu item being sent 
console.log("Menu item ID: " + info.menuItemId + " was clicked"); 

//Send message to content.js with the current tab id and menuItemId clicked 
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {menuId: info.menuItemId}, 

//On response from content.js log it to console. 
function(response) { 
if(response.gotIt == "Got it"){ 
      console.log("Got it!"); 
} 
    }); 
    }); 
}); 

Inhalt

//Listener waiting for messages 
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 

console.log(sender.tab ? 
      "from a content script:" + sender.menuId : "from the extension"); 

//if message states menu id of 4 then send response back to background 
if (request.menuID == "4") 

sendResponse({gotIt: "Got it"}); 

}); 

Fehlermeldung

extensions::uncaught_exception_handler:8 Error in event handler for (unknown): TypeError: Cannot read property 'gotIt' of undefined

Error message screen grab

Dies ist ein zu einer vorherigen Frage nachgehen i here über Kontextmenü hatte. Ich habe eine neue Frage als Ergebnis der Antwort dort erstellt und Code hat sich genug geändert, dass ich denke, es ist das Beste, hier ein neues zu fragen.

+0

Können Sie die genaue Fehlermeldung einfügen? – Xan

+0

Hallo @Xan danke für deine Hilfe. Ich habe die genaue Fehlermeldung hinzugefügt und einen Screenshot gemacht, nur für den Hauptbeitrag. – Lmnoppy

+0

Dies bedeutet wahrscheinlich, dass das Inhaltsskript nicht auf der aktiven Registerkarte zu hören ist. Wie wird es injiziert? Überprüfen Sie auch im Callback nach 'chrome.runtime.lastError'. – Xan

Antwort

2

Es ist ein Tippfehler in Ihrem content.js,

request.menuID == "4" 

sollte Neben

request.menuId == "4" 

sein, könnten Sie Ihre background.js robuster machen, indem geprüft wird, ob Reaktion nicht definiert ist.

if (typeof response !== "undefined" && response.gotIt == "Got it") { 
    console.log("Got it!"); 
} 
+0

Nein, sollte nicht so sein, wie ich die Berechtigungen bereits eingerichtet habe. obwohl ive meine Manifest-Datei zu der Frage hinzufügt, falls es ein Problem mit dem gibt – Lmnoppy

+0

Das ist jetzt richtig, aber das bedeutet, dass die Frage als "Tippfehler" geschlossen werden sollte – Xan

+0

haha ​​Danke! Ich habe mir das stundenlang angeschaut und das nie bemerkt! Wie schließe ich als Tippfehler? – Lmnoppy