web-dev-qa-db-fra.com

chrome.tabs renvoie undefined dans le script de contenu

chrome.tabs renvoie undefined malgré le fait que je mette des onglets dans le bloc des autorisations.

"permissions": [
    "tabs",
    "http://*/*",
    "https://*/*"
],
"content_scripts": [
    {
        "matches": [
            "http://*/*",
            "https://*/*"
        ],
        "js": [
            "js/myScript.js"
        ],
        "all_frames": true
    }
],

Mais dans myScript.js, les retours suivants ne sont pas définis.

chrome.tabs   
33
Guy Korland

Comme le script de contenu a ses propres limites,

chrome.tabs n'est disponible que dans les scripts d'arrière-plan et les scripts contextuels.

Si vous voulez utiliser chrome.tabs puis passez le message de content_script au script d'arrière-plan et jouez avec chrome.tabs.

56
Raghvendra Parashar

Les scripts de contenu n'ont qu'un accès limité aux API Chrome. Cet accès n'inclut pas l'API que vous essayez d'utiliser (par exemple chrome.tabs). Si vous devez utiliser cette API, vous devrez le faire dans un script d'arrière-plan 1.

Comme indiqué dans la documentation des scripts de contenu de Chrome , les API disponibles pour un script de contenu sont [J'ai placé des méthodes obsolètes dans barré format]:

Quelques-unes des API répertoriées sont obsolètes et le sont depuis un certain temps. Ceux qui sont déconseillés se sont déplacés vers différents emplacements (également répertoriés ci-dessus):

Bien qu'il ne soit pas officiellement obsolète, extension.lastError Est également disponible sous la forme runtime.lastError . À ce stade, il est généralement fait référence à cet endroit:

Partitionnez votre extension en scripts d'arrière-plan et en scripts de contenu

Vous devrez séparer votre code en ce qui doit être dans un script d'arrière-plan et ce qui doit être dans les scripts de contenu, en fonction des capacités disponibles pour chaque type de script. Les scripts de contenu ont accès au DOM de la page Web dans laquelle ils sont injectés, mais un accès limité aux API d'extension. Les scripts d'arrière-plan ont un accès complet aux API d'extension, mais aucun accès au contenu de la page Web. Vous devriez lire la vue d'ensemble de l'extension Chrome , et les pages liées à partir de là, pour avoir une idée des fonctionnalités qui devraient être situées dans quel type de script.

Il est courant de devoir communiquer entre vos scripts de contenu et vos scripts d'arrière-plan. Pour ce faire, vous pouvez utiliser le message en passant . Cela vous permet de communiquer des informations entre les deux scripts pour accomplir des choses qui ne sont pas possibles en utilisant un seul type de script. Par exemple, dans votre script de contenu, vous aurez peut-être besoin d'informations qui ne sont disponibles que dans l'une des autres Chrome Chrome, ou vous avez besoin que quelque chose se produise qui puisse être effectué de manière plus appropriée (ou uniquement) via l'une des autres Chrome. Dans ces cas, vous devrez envoyer un message à votre script d'arrière-plan, en utilisant chrome.runtime.sendMessage() , pour lui dire ce qui doit être fait, tout en fournissant suffisamment d'informations pour qu'il puisse le faire. Votre script d'arrière-plan peut alors retourner les informations souhaitées, le cas échéant , à votre script de contenu. Vous aurez également des moments où le traitement sera principalement effectué dans le script d'arrière-plan. Le script d'arrière-plan peut injecter un script de contenu, ou simplement envoyer un message à un script déjà injecté, pour obtenir des informations à partir d'une page, modifications de la page Web.


  1. Script d'arrière-plan désigne tout script se trouvant dans le contexte d'arrière-plan. En plus des scripts réels background , cela inclut des fenêtres contextuelles et des pages d'options, etc. Cependant, la seule page que vous pouvez être sûr d'avoir constamment disponible pour recevoir des messages à partir d'un script de contenu sont vos scripts réels background définis dans manifest.json . D'autres pages peuvent être disponibles à certains moments en raison de l'interaction de l'utilisateur avec le navigateur, mais elles ne sont pas disponibles de manière cohérente.

Cette réponse a été déplacée d'une question en double , puis modifiée.

8
Makyen

https://developer.chrome.com/extensions/tabs#method-getSelected montre

getSelected

chrome.tabs.getSelected (entier windowId, fonction callback)
Déconseillé depuis Chrome 33. Veuillez utiliser tabs.query {active: true}.
Obtient l'onglet sélectionné dans la fenêtre spécifiée.

Vous devriez peut-être utiliser chrome.tabs.query dans popup.js comme ceci

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    console.log(tabs[0].url);
});

, rechargez votre extension et vérifiez le résultat dans l'élément inspect de votre extension.

image du résultat

image de code

https://developer.chrome.com/extensions/tabs#type-Tab montre que L'URL que l'onglet affiche. Cette propriété n'est présente que si le manifeste de l'extension inclut l'autorisation "tabs". (Juste pour rappeler à quelqu'un que j'ai oublié. Je l'ai oublié quand je l'ai testé.)

1
真能逗我笑