40 votes

Comment obtenir l'identifiant de l'onglet actuel à partir de la page d'arrière-plan ?

Comment obtenir l'identifiant de l'onglet actuel à partir de la page d'arrière-plan ? L'onglet courant est l'onglet dont l'utilisateur peut voir le contenu.

arrière-plan.html

<html>
<head>
    <script>

    if(typeof localStorage.state == 'undefined')
        localStorage.state = 'off'
    chrome.browserAction.onClicked.addListener(function(tab) {
        if(localStorage.state == 'on')
        {
            localStorage.state = 'off';
        }
        else
        {
            localStorage.state = 'on';
        }
        chrome.browserAction.setBadgeText({text: localStorage.state, tabId: tab.id});
        chrome.tabs.sendRequest(tab.id, {state: localStorage.state});
        //chrome.tabs.sendRequest(tab.id, {state: localStorage.state});
    });
    </script>
</head>

53voto

Arithmomaniac Points 1128

getSelected a été obsolète . La nouvelle façon de procéder est la suivante :

chrome.tabs.query(
  {currentWindow: true, active : true},
  function(tabArray){...}
)

Si vous voulez effectuer un callback sur l'onglet actif, vous pouvez envelopper ce qui précède de la manière suivante :

function doInCurrentTab(tabCallback) {
    chrome.tabs.query(
        { currentWindow: true, active: true },
        function (tabArray) { tabCallback(tabArray[0]); }
    );
}

Par exemple

var activeTabId;
doInCurrentTab( function(tab){ activeTabId = tab.id } );

0 votes

@neaumusic J'ai un problème avec votre édition. Il modifie un peu trop le code de l'auteur et contient de fausses informations ( tabArray[0] n'est pas un identifiant). J'annule cette mesure.

0 votes

@neaumusic Cela dit, vous pouvez tout à fait publier votre code en tant que réponse.

3 votes

Cela ne semble plus du tout fonctionner. Si je fais un console.log(activeTabId); à l'intérieur du callback (par ex. function(tab){ ... } ) Je vois que tab.id est défini, mais dès que doInCurrentTab est renvoyé, activeTabId reste indéfini. Est-ce que Google a changé quelque chose qui a cassé cela ?

7voto

mc. Points 107

Exécutez ceci dans votre page d'arrière-plan

chrome.tabs.query({active:true,windowType:"normal", currentWindow: true},function(d){console.debug(d);})

ou mieux encore

chrome.tabs.query({active:true,windowType:"normal", currentWindow: true},function(d){console.debug(d[0].id);})

2 votes

Cette opération permet de récupérer tous les onglets actifs dans toutes les fenêtres. Ainsi, si vous avez plus d'une fenêtre ouverte, vous récupérerez plusieurs onglets.

1 votes

Pour les spectateurs, il s'agissait d'un montage avec currentWindow pour résoudre le problème de Soviut.

0 votes

Notez que l'exécution de ce code dans la fenêtre devtools d'une page d'arrière-plan ne donnera rien. Si vous l'exécutez dans un délai d'attente et que vous passez ensuite à la fenêtre normale, vous verrez qu'il renvoie l'onglet actif : setTimeout(() => chrome.tabs.query({ currentWindow: true, active: true }, console.log), 2000)

5voto

Elier Points 359

Selon la documentation officielle : Manifeste V3 (promesse), qui sera appliqué à partir de janvier 2023. https://developer.chrome.com/docs/extensions/reference/tabs/#get-the-current-tab

async function getCurrentTab() {
  let queryOptions = { active: true, lastFocusedWindow: true };
  let [tab] = await chrome.tabs.query(queryOptions);
  return tab;
}

3voto

serg Points 43893

De nombreuses méthodes de l'API interprètent les null en tant qu'onglet actuel. chrome.tabs.sendRequest est l'un d'entre eux.

Dans le cas contraire :

chrome.tabs.getSelected(null, function(tab) { ... })

0 votes

Il convient désormais d'utiliser l'expression "requête" : developer.chrome.com/docs/extensions/reference/tabs/

1voto

neaumusic Points 407

Si vous avez tabs la méthode d'interrogation est la suivante : chrome.tabs.query


getCurrentWindowActiveTabIndex().then(tabIndex => {
    // do something
});

// asnyc getter, not just a regular 'thunk'
function getCurrentWindowActiveTabIndex () {
    return new Promise((resolve, reject) => {
        chrome.tabs.query({
            currentWindow: true,
            active: true,
        }, (currentWindowActiveTabs = []) => {
            if (!currentWindowActiveTabs.length) reject();
            resolve(currentWindowActiveTabs[0].index);
        });
    });
}

3 votes

Une petite explication de ce que fait ce code, et pourquoi cette réponse est meilleure que d'autres, serait la bienvenue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X