Accéder à la « fenêtre »/DOM/HTML d'une page Web à partir d'une extension
P粉046878197
P粉046878197 2023-10-18 09:44:00
0
2
663

J'écris une extension Chrome et j'essaie de superposer

sur la page Web actuelle dès que l'on clique sur un bouton dans un fichier popup.html.

Lorsque j'accède à la méthode document.body.insertBefore à partir de popup.html, elle écrase le document.body.insertBefore 方法时,它会覆盖弹出窗口上的

sur la fenêtre contextuelle au lieu de la page Web actuelle.

Dois-je utiliser la messagerie entre background.html et popup.html pour accéder au DOM de la page web ? J'aimerais tout faire dans popup.html et également utiliser jQuery si possible.

P粉046878197
P粉046878197

répondre à tous(2)
P粉296080076

Quelques exemples d'utilisation de l'injection programmatique pour ajouter un script contextuel extensible à ce div.

Manifeste V3

N'oubliez pas d'ajouter des autorisations dans manifest.json, voir les autres réponses pour plus d'informations.

  • Appel simple :

    (async () => {
      const [tab] = await chrome.tabs.query({active: true, currentWindow: true});
      await chrome.scripting.executeScript({
        target: {tabId: tab.id},
        func: inContent1,
      });
    })();
    
    // executeScript runs this code inside the tab
    function inContent1() {
      const el = document.createElement('div');
      el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red';
      el.textContent = 'DIV';
      document.body.appendChild(el);
    }
    

    Remarque : Dans Chrome 91 ou version antérieure, func: 应为 function:.

  • Appelez avec paramètres et recevez les résultats

    Nécessite Chrome 92 lors de sa mise en œuvre args.

    Exemple 1 :

    res = await chrome.scripting.executeScript({
      target: {tabId: tab.id},
      func: (a, b) => { return [window[a], window[b]]; },
      args: ['foo', 'bar'],
    });
    

    Exemple 2 :

    (async () => {
      const [tab] = await chrome.tabs.query({active: true, currentWindow: true});
      let res;
      try {
        res = await chrome.scripting.executeScript({
          target: {tabId: tab.id},
          func: inContent2,
          args: [{ foo: 'bar' }], // arguments must be JSON-serializable
        });
      } catch (e) {
        console.warn(e.message || e);
        return;
      }
      // res[0] contains results for the main page of the tab 
      document.body.textContent = JSON.stringify(res[0].result);
    })();
    
    // executeScript runs this code inside the tab
    function inContent2(params) {
      const el = document.createElement('div');
      el.style.cssText = 'position:fixed; top:0; left:0; right:0; background:red';
      el.textContent = params.foo;
      document.body.appendChild(el);
      return {
        success: true,
        html: document.body.innerHTML,
      };
    }
    

Liste V2

  • Appel simple :

    // uses inContent1 from ManifestV3 example above
    chrome.tabs.executeScript({ code: `(${ inContent1 })()` });
    
  • Appelez avec paramètres et recevez le résultat :

    // uses inContent2 from ManifestV3 example above
    chrome.tabs.executeScript({
      code: `(${ inContent2 })(${ JSON.stringify({ foo: 'bar' }) })`
    }, ([result] = []) => {
      if (!chrome.runtime.lastError) {
        console.log(result); // shown in devtools of the popup window
      }
    });
    

    Cet exemple utilise la fonction inContent pour convertir automatiquement le code en chaîne. L'avantage est que l'EDI peut appliquer la coloration syntaxique et le peluchage. L'inconvénient évident est que le navigateur perd du temps à analyser le code, mais cela prend généralement moins d'une milliseconde, donc c'est négligeable.

P粉600402085

Problème : Les pages d'extension (popups, options, pages de fond dans MV2, etc.) sont séparées de la page web, elles ont leur propre DOM, document、window 和 chrome-extension://URL.

Solution : utilisez Content Scripts pour accéder aux pages Web ou interagir avec leur contenu.

  • Les scripts de contenu sont exécutés dans la page Web, pas dans l'extension.
  • Les scripts de contenu sont isolés par défaut, voir Comment exécuter du code dans le contexte de la page (également connu sous le nom de monde principal).
  • Ne chargez pas de scripts de contenu dans les pages d'extension.

Méthode 1. Déclarative

manifest.json :

"content_scripts": [{
  "matches": ["*://*.example.com/*"],
  "js": ["contentScript.js"]
}],

Il s'exécutera une fois lors du chargement de la page. Après cela, utilisez Messaging.

Attention ! Il ne peut pas envoyer d'éléments DOM, Maps, Sets, ArrayBuffers, classes, fonctions, etc. Il ne peut envoyer que des objets et des types simples compatibles JSON, vous devez donc extraire manuellement les données requises et les transmettre sous forme de simple tableau ou objet.

Méthode 2. Programmation

  • ManifestV3 :

    Dans les scripts d'extension (tels que les fenêtres contextuelles), des scripts/fonctions de contenu peuvent être injectés dans les onglets selon les besoins.

    Le résultat de cette méthode est la dernière expression du script de contenu et peut donc être utilisé pour extraire des données. Les données doivent être compatibles JSON, voir l'avertissement ci-dessus.

    Obligatoire

    dans 权限manifest.json :

    • “脚本” - obligatoire ;
    • "activeTab" - Scénario idéal, adapté pour répondre aux actions des utilisateurs (généralement en cliquant sur une icône d'extension dans la barre d'outils). N'affichez aucun avertissement d'autorisation lors de l'installation d'extensions.

    Si l'idéal n'est pas possible, ajoutez les sites autorisés à host_permissions dans manifest.json :

    • “*://*.example.com/” et tout autre site internet de votre choix.

    • """*://*/" Ceux-ci placeront votre extension dans une file d'attente de révision très lente dans le Chrome Web Store en raison des autorisations étendues de l'hôte.

  • Différences entre ManifestV2 et ce qui précède :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal