Ich versuche, über mein Popup auf den ActiveTab-DOM-Inhalt zuzugreifen. Hier ist mein Manifest:
{
"manifest_version": 2,
"name": "Test",
"description": "Test script",
"version": "0.1",
"permissions": [
"activeTab",
"https://api.domain.com/"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"browser_action": {
"default_icon": "icon.png",
"default_title": "Chrome Extension test",
"default_popup": "index.html"
}
}
Ich bin wirklich verwirrt, ob Hintergrundskripte (Ereignisseiten mit Persistenz: false) oder content_scripts der richtige Weg sind. Ich habe die gesamte Dokumentation und andere SO-Beiträge gelesen und es macht für mich immer noch keinen Sinn.
Kann jemand erklären, warum ich eins über das andere verwenden könnte.
Hier ist die background.js, die ich versucht habe:
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
// LOG THE CONTENTS HERE
console.log(request.content);
}
);
Und ich führe dies nur über die Popup-Konsole aus:
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, { }, function(response) {
console.log(response);
});
});
Ich erhalte:
Port: Could not establish connection. Receiving end does not exist.
AKTUALISIEREN:
{
"manifest_version": 2,
"name": "test",
"description": "test",
"version": "0.1",
"permissions": [
"tabs",
"activeTab",
"https://api.domain.com/"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"browser_action": {
"default_icon": "icon.png",
"default_title": "Test",
"default_popup": "index.html"
}
}
content.js
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.text && (request.text == "getDOM")) {
sendResponse({ dom: document.body.innerHTML });
}
}
);
popup.html
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, { action: "getDOM" }, function(response) {
console.log(response);
});
});
Wenn ich es ausführe, erhalte ich immer noch den gleichen Fehler:
undefined
Port: Could not establish connection. Receiving end does not exist. lastError:30
undefined
quelle
chrome.runtime.sendMessage
Sendet Nachrichten an die BackgroundPage und an Popups.chrome.tabs.sendMessage
sendet Nachrichten an ContentScripts.Sie müssen die Nachrichtenübergabe nicht verwenden, um DOM abzurufen oder zu ändern. Ich habe
chrome.tabs.executeScript
stattdessen verwendet. In meinem Beispiel verwende ich nur die ActiveTab-Berechtigung, daher wird das Skript nur auf der aktiven Registerkarte ausgeführt.Teil von manifest.json
index.html
test.js
quelle
activeTab
Berechtigung verwenden, ist ungenau. Sie erhalten eindeutig<all_urls>
zusätzlich zuactiveTab
.Für diejenigen, die gkalpak Antwort versucht und es hat nicht funktioniert,
Beachten Sie, dass Chrome das Inhaltsskript nur dann zu einer benötigten Seite hinzufügt, wenn Ihre Erweiterung beim Starten von Chrome aktiviert wurde. Außerdem sollten Sie den Browser nach diesen Änderungen neu starten
quelle