Ich entwickle eine Erweiterung für Google Chrome Browser. Ich konnte nicht herausfinden, wie man auf das aktuelle Tab-DOM-Objekt von der "popup.html" Seite zugreift. irgendwelche Vorschläge?Zugreifen auf aktuelle Registerkarte DOM-Objekt von "popup.html"?
Antwort
Standardmäßig bezieht sich das Objekt "Dokument" innerhalb von popup.js/popup.html nur auf das Dokument des Popup-Fensters der Erweiterung. Um das DOM für eine bestimmte Registerkarte (z. B. die derzeit aktive Registerkarte) abzurufen, müssen Sie content scripts communications verwenden. Zum Beispiel müssen wir über popup, einen Antrag der extension auf Ihren Content-Skript senden, so in der popup.html Sie so etwas tun:
chrome.tabs.getSelected(null, function(tab) {
// Send a request to the content script.
chrome.tabs.sendRequest(tab.id, {action: "getDOM"}, function(response) {
console.log(response.dom);
});
});
Jetzt im Content-Skript, müssen wir listen for those events von der kommenden Erweiterung, so dass in einigen Datei mit dem Namen wir dom.js
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
if (request.action == "getDOM")
sendResponse({dom: "The dom that you want to get"});
else
sendResponse({}); // Send nothing..
});
einrichten erinnern Sie nun Ihre manifest den Inhalt Skript und Registerkarte Berechtigung aufzunehmen.
Diese Antwort scheint nicht mit der neuesten API zu funktionieren. Dies ist ein funktionierendes Beispiel.
popup.js:
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var tab = tabs[0];
console.log(tab.url, tab.title);
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(msg) {
msg = msg || {};
console.log('onResponse', msg.farewell);
});
});
});
getDescription.js:
window.onload = function() {
chrome.runtime.onMessage.addListener(function(msg, _, sendResponse) {
console.log('onMessage', msg);
if (msg.greeting == "hello") {
sendResponse({farewell: "goodbye"});
} else{
sendResponse({});
}
});
};
relevanten Teile manifest.json:
{
"permissions": [
"tabs"
],
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["getDescription.js"]
}
]
}
Dies ist die neueste fix:
popup.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
console.log(response.farewell);
});
});
(Hinweis: die oben console.log (response.farewell) ist für popup.html, nicht aktuellen Tab)
contentscript.js
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.greeting == "hello")
sendResponse({farewell: "goodbye"});
});
- 1. Schließen Aktuelle Registerkarte
- 2. Aktuelle Registerkarte hervorheben?
- 3. Zugreifen auf "aktuelle Klasse" von WPF benutzerdefinierte MarkupExtension
- 4. Holen Sie sich das aktuelle Fragment von ActionBar Registerkarte
- 5. schwimmend popup.html div
- 6. Tippen Sie auf die aktuelle Registerkarte (UITabBarController) iPhone App
- 7. Speichern von Benutzereinstellungen in popup.html Chrome-Erweiterung
- 8. wie auf das aktuelle Wort in einem beliebigen Programm zugreifen
- 9. YUI3 aktuelle Registerkarte in TabView finden
- 10. Aktuelle Registerkarte ausblenden und die nächste Registerkarte basierend auf href anzeigen?
- 11. Wie kann ich auf die aktuelle Woocommerce-Bestellnummer zugreifen?
- 12. Registerkarte XPCOM auf der Registerkarte
- 13. Chrome Erweiterung: onclick Erweiterung Symbol, öffnen Sie popup.html in der neuen Registerkarte
- 14. Möchten Sie auf lokalen Speicher von Chrome-Erweiterung zugreifen
- 15. Chrome Erweiterung: popup.html dynamisch erstellen über contentscript.js
- 16. Warnung nicht in popup.html der Chrome-Erweiterung
- 17. Können Chrome-Inhaltsscripts auf window.opener zugreifen?
- 18. Chrome tabs.on Aktiviert, nur die aktuelle Registerkarte zu aktualisieren
- 19. Zugreifen auf ViewContext von Klassenbibliothek
- 20. Zugreifen auf Array von Strings
- 21. Chrome Extension - Wie übergibt man Variablen von JS an popup.html?
- 22. DJANGO - Wie Sie auf die aktuelle Modellinstanz von innerhalb eines Formulars zugreifen
- 23. Die aktuelle Ansicht wird auf meinem Fenster hinzugefügt und wieder auf die benutzerdefinierte Registerkarte tippen
- 24. Wie programm öffnet Chrome-Erweiterung popup.html
- 25. müssen Link in neue Registerkarte des Browsers öffnen, ohne die aktuelle Registerkarte zu verlassen
- 26. Datenschutzerklärung auf Facebook Registerkarte
- 27. Fokus auf Tastatur Registerkarte
- 28. Öffnen Sie popup.html, wenn Sie in Extension-Symbol klicken
- 29. die aktuelle aktive Registerkarte in einem Bootstrap-Menü einstellen
- 30. Hinzufügen von Sharethis Tasten zu Chrome-Erweiterung popup.html
Ich meine mit dem DOM ist Document Object Model ... danke –
Ja, was ich dir in meinem Beispiel gezeigt habe, ist synchrones Messaging in Chrome Extensions. Ich habe einen String "Das Dom, das du bekommen willst" zurückgegeben, aber in Wirklichkeit kannst du jedes beliebige DOM zurückgeben. Wenn du alles im Körper bekommen willst, kannst du "sendResponse ({dom: document.getElementsByTagName (" body ") [0]});" –
funktioniert das obige Beispiel? Die AFAIK-Sendeantwort wird das dom als json serialisieren, was aufgrund der kreisförmigen Struktur des dom-Objekts wahrscheinlich zu einem Fehler führen wird. –