Abrufen der ID “dieser” Registerkarte aus dem Inhaltsskript in der Chrome-Erweiterung?

Lesezeit: 3 Minuten

Benutzer-Avatar
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.

Benutzer-Avatar
serg

Die Tab-ID wird automatisch weitergegeben Nachrichtensender Objekt:

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

Benutzer-Avatar
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:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    var myTabId = tabs[0].id;
    chrome.tabs.sendMessage(myTabId, {text: "hi"}, function(response) {
        alert(response);
    });
});

  • „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:

const injectTabId = (callback) => chrome.tabs.executeScript(
  tabId,
  {code: `window.tabId = ${tabId}`},
  callback
);

const injectFile = () => chrome.tabs.executeScript(
  tabId,
  {file: 'content.js'}
);

injectTabId(injectFile);

Greifen Sie im Inhaltsskript mit darauf zu window.tabId. Die Variable wird Seitenskripten nicht ausgesetzt, da Inhaltsskripte in einer isolierten Welt leben.

1078120cookie-checkAbrufen der ID “dieser” Registerkarte aus dem Inhaltsskript in der Chrome-Erweiterung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy