Es gibt zahlreiche Versionen dieser Frage, und ich habe sie überprüft und viele Dinge ausprobiert, ohne Erfolg. Ich bin neu in Chrom-Erweiterungen, und ich könnte viele Dinge vermissen, aber ich weiß nicht was.Chrome Erweiterung sendResponse funktioniert nicht
Zunächst möchte ich darauf hinweisen, dass ich mehrere beanspruchte Arbeitsbeispiele aus verschiedenen Antworten kopiert habe, und keine von ihnen funktioniert für mich. Ich verwende Chrome Version 58.0.3029.81 unter Windows 7 Professional.
Ob es sich um meinen Code oder um Beispiele handelt, die ich kopiert habe, der Code im Inhaltsskript wird ausgeführt, und sendResponse wird mit der richtigen Antwort aufgerufen. Darüber hinaus nichts - die angegebene Callback-Funktion wird nie ausgeführt.
Hier ist meine aktuellen Code:
manifest.json
{
"manifest_version": 2,
"name": "TestExtension",
"description": "...",
"version": "1.0",
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [ "content.js" ]
}
],
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html",
"default_title": "Send a checkpoint request"
},
"permissions": [
"activeTab",
"tabs",
"http://*/*", // allow any host
"https://*/*" // allow any secure host
]
}
popup.js
document.addEventListener('DOMContentLoaded', function()
{
document.getElementById('extension_form').onsubmit = function()
{
var elementName = "DataAccessURL";
chrome.tabs.query(
{
active: true,
currentWindow: true
},
function (tabs)
{
chrome.tabs.sendMessage(
tabs[0].id,
{ Method: "GetElement", data: elementName },
function (response)
{
debugger;
console.log("response:Element = " + response.Element);
alert(response.Element);
});
});
};
});
content.js
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse)
{
console.log("In Listener");
if (request.Method && request.Method == "GetElement")
{
var result = "";
var element = request.data;
console.log(element);
var e = document.getElementById(element);
if (e) result = e.innerHTML;
console.log(result);
sendResponse({ Element: result });
return true; // <-- the presence or absence of this line makes no difference
}
});
irgendwelche Hinweise würden geschätzt. Ich verstehe einfach nicht, warum mein Rückruf nicht angerufen wird.
Das Popup ist ein separates Fenster mit einer eigenen Konsole und Devtools: Klicken Sie mit der rechten Maustaste auf das Popup und wählen Sie Inspizieren, um den Code zu debuggen. Stellen Sie außerdem sicher, dass das Inhaltsskript tatsächlich eingefügt wird. – wOxxOm
@wOxxOm: Danke - die sendMessage in popup.js wird geladen und ausgeführt. Der Listener-Code in content.js wird aufgerufen und ausgeführt. Es erhält die richtigen Daten und ruft sendResponse mit dem Ergebnis auf. Aber wieder wird der Rückruf, der als dritter Parameter für sendMessage angegeben ist, nie aufgerufen. Es hat derzeit eine Debugger-Anweisung, die nie getroffen wird, auch wenn der Code im separaten Devtools-Fenster angezeigt wird, wie Sie es vorschlagen. – MisterAcoustic
Klingt wie das Popup geschlossen wird, bevor es die Antwort erhalten kann. Wenn das Popup geschlossen ist, ist seine Umgebung (Code/DOM) nicht mehr vorhanden. – wOxxOm