Abrufen der ID “dieser” Registerkarte aus dem Inhaltsskript in der Chrome-Erweiterung?
Lesezeit: 3 Minuten
void.zeiger
Von einem Inhaltsskript aus ist es möglich, auf diese Registerkarten zuzugreifen id?
Ich möchte eine Nachricht vom Inhaltsskript an die Hintergrundseite senden, die meiner Erweiterung mitteilt, „etwas mit dieser Registerkarte zu tun“, indem ich die chrome.tabs.* API.
EIN tabID benötigt wird, und es hat keinen Sinn, auf der Hintergrundseite eine Menge Logik anzuwenden, um nach einem zu suchen tabID wenn mein Inhaltsskript das einfach sagen kann tabID im Nachrichteninhalt.
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("sent from tab.id=", sender.tab.id);
});
Danke… Den Absenderparameter habe ich komplett übersehen. Ich dachte, ich müsste this.tabId oder etwas in meinem Inhaltsskript tun.
– void.pointer
1. Juni 2011 um 17:16 Uhr
Für die Nachwelt: Leider sind die tabIds, die in den Objekten der Antwortdetails von chrome.WebRequest gemeldet werden, konsistent -1 für Anfragen, die von Hintergrundseiten initiiert wurden (zum Zeitpunkt dieses Kommentars).
– MrChrisRodriguez
30. Juni 2014 um 15:25 Uhr
@serg: Was ist, wenn ich tabID außerhalb des Nachrichtenantwortprozessors benötige?
– c00000fd
9. Oktober 2014 um 4:24 Uhr
Ich bekomme folgendes: Nicht erfasster Fehler: sendRequest und onRequest sind veraltet. Bitte verwenden Sie stattdessen sendMessage und onMessage
– Stepan Jakowenko
19. Mai 2016 um 8:48 Uhr
@ c00000fd: Siehe meine Antwort unten.
– Hilfe bei der
31. Mai 2019 um 22:38 Uhr
Hilfe bei der
Wenn du willst tabId von sich selbst (in meinem Fall im Inhaltsskript), ohne dass “tabs“-Berechtigung besteht eine Problemumgehung darin, dass das Inhaltsskript eine Dummy-Nachricht an das Hintergrundskript sendet und dann das Hintergrundskript darauf antwortet sender.tab.id zurück zum Inhaltsskript!
zB hinein content.js:
chrome.runtime.sendMessage({ text: "what is my tab_id?" }, tabId => {
console.log('My tabId is', tabId);
});
und in background.js:
chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
if (msg.text == "what is my tab_id?") {
sendResponse({tab: sender.tab.id});
}
});
Es ist eine dumme Problemumgehung, die für mich funktioniert hat. 🙂
PS. Ach, wenn ja tabs Berechtigung dann können Sie diese asynchrone Abfrage sehr einfach ausführen:
„sendResponse() wird aus der W3C-Spezifikation entfernt. Die beliebte webextension-polyfill-Bibliothek hat die sendResponse()-Funktion bereits entfernt“, heißt es MDN
– Kong Kao
25. September 2021 um 9:43 Uhr
@KongKao kann ich nicht verwenden sendResponse() erfolgreich in Firefox, kann aber auch diesen Text in Ihrem Link nicht finden, wo es so steht sendResponse() wird entfernt
– Madakol
16. April um 21:24 Uhr
chrome.tabs.query kann nicht innerhalb eines Inhaltsskripts verwendet werden. Es ist nur in Hintergrund- und Popup-Skripts verfügbar.
– Mamaji
13. Juli um 15:29 Uhr
Wenn Sie Ports für langlebige Zwei-Wege-Verbindungen verwenden, ist das zweite Argument im Callback ein Port-Objekt. Der Zugriff auf die Registerkarten-ID ist also:
chrome.runtime.onConnect.addListener(port => {
if (port.name === "foo") {
port.onMessage.addListener((msg, sendingPort) => {
console.log("sent from tab.id=", sendingPort.sender.tab.id);
});
}
});
Korrektur der ausgewählten Antwort für heute:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("sent from tab.id=", sender.id);
});
Wenn ein Inhaltsskript programmgesteuert eingefügt wird, ist ein anderer Ansatz das Speichern tabId in einer globalen Variablen:
Greifen Sie im Inhaltsskript mit darauf zu window.tabId. Die Variable wird Seitenskripten nicht ausgesetzt, da Inhaltsskripte in einer isolierten Welt leben.
10781200cookie-checkAbrufen der ID “dieser” Registerkarte aus dem Inhaltsskript in der Chrome-Erweiterung?yes