Partager via


Partie 2 du tutoriel : Utiliser JavaScript pour insérer une image dans la page web

L’exemple Partie 2 : Utiliser JavaScript pour insérer une image dans la page web utilise du code JavaScript pour insérer l’image stars.jpeg en haut de la page web actuellement ouverte. La fenêtre contextuelle de l’extension contient un titre et un bouton HTML intitulé Affichage. Lorsque vous cliquez sur le bouton Afficher , JavaScript envoie un message à partir de la fenêtre contextuelle de l’icône d’extension et insère dynamiquement JavaScript en tant que contenu dans l’onglet du navigateur.

L’exemple partie 2 utilise les technologies d’extension suivantes :

  • Injection de bibliothèques JavaScript dans une extension.
  • Exposition des ressources d’extension aux onglets du navigateur.
  • Inclusion de pages web de contenu dans des onglets de navigateur existants.
  • Les pages web de contenu écoutent les messages des fenêtres contextuelles et répondent.

Vous ouvrirez l’extension partie 2 à partir du bouton Extensions (icône Extensions) après avoir installé l’extension via l’onglet Gérer les extensions :

Cliquez sur l’icône de l’extension pour ouvrir l’extension

L’extension affiche une petite page HTML dans une fenêtre contextuelle, contenant un titre, des instructions et un bouton Afficher :

popup.html'affichage après avoir sélectionné l’icône Extension

Lorsque vous cliquez sur le bouton Afficher , le code JavaScript s’insère stars.jpeg temporairement en haut de la page web active, ce qui pousse le contenu de la page web sous l’image. Le contenu injecté définit l’élément image à afficher stars.jpeg en haut de la page web active, puis supprime l’image lorsque vous cliquez sur l’image :

Image affichée dans le navigateur

Si vous souhaitez installer et exécuter immédiatement l’extension terminée, ou afficher son code terminé, procédez comme suit :

Vous pouvez ensuite installer et exécuter l’extension terminée qui se trouve dans le référentiel, par chargement indépendant d’une extension pour l’installer et la tester localement. L’onglet doit contenir une page web avant d’ouvrir l’extension.

Étape 1 : Mettre à jour popup.html pour inclure un bouton

Pour utiliser cet article, commencez par effectuer les étapes décrites dans tutoriel partie 1 : Afficher une image dans une fenêtre contextuelle ; autrement dit, clonez le dépôt MicrosoftEdge-Extensions, installez la démonstration de la partie 1 et exécutez cette démonstration.

Cette étape a déjà été effectuée dans popup.html dans le dépôt MicrosoftEdge-Extensions.

L’état de départ hypothétique de cet article de la partie 2, si vous deviez générer manuellement l’exemple pour ajouter JavaScript, est qu’il existe un répertoire pour le code de la partie 2, contenant les mêmes répertoires et fichiers que les fichiers créés dans l’article partie 1. Il peut s’agir de répertoires frères pour les parties 1 et 2, comme dans le dépôt MicrosoftEdge-Extensions.

Il est possible d’installer côte à côte les démonstrations des parties 1 et 2 à partir du dépôt MicrosoftEdge-Extensions. Nous vous recommandons d’abord de cloner le référentiel et d’installer et d’exécuter les démonstrations, avant (ou au lieu de) de commencer par un répertoire vide, puis de créer manuellement des répertoires, de créer des fichiers et de coller du code dans les fichiers.

Pour développer manuellement la démonstration de partie 1 terminée afin de créer la démonstration de la partie 2, vous devez effectuer les opérations suivantes :

  1. Dans le dossier qui contient le fichier de la popup.html partie 2 (initialement une copie du fichier partie 1), ajoutez un balisage qui affiche un titre avec un bouton.
  2. Incluez une référence à un fichier JavaScript, popup.js.
  3. Programmez ce bouton.

Voici l’exemple de fichier HTML :

/popup/popup.html (terminé) :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <style>
            body {
                width: 500px;
            }
            button {
                background-color: #336dab;
                border: none;
                color: white;
                padding: 15px 32px;
                text-align: center;
                font-size: 16px;
            }
        </style>
    </head>
    <body>
        <h1>Display the NASA picture of the day</h1>
        <h2>(click the image to remove it from the webpage)</h2>
        <button id="sendmessageid">Display</button>
        <script src="popup.js"></script>
    </body>
</html>

Effectuez les étapes décrites dans Charger une extension pour l’installer et la tester localement pour mettre à jour localement l’extension, puis exécuter l’extension. L’onglet doit contenir une page web avant d’ouvrir l’extension.

Après la mise à jour et l’ouverture de l’extension, une fenêtre contextuelle s’ouvre, contenant une petite page HTML avec un titre, des instructions et un bouton Afficher :

popup.html après avoir cliqué sur l’icône de l’extension

Étape 2 : Mettre à jour la page web pour insérer l’image en haut

Après avoir ajouté le bouton Afficher , la tâche suivante consiste à faire en sorte que le bouton affiche le images/stars.jpeg fichier image en haut de la page web qui se trouve dans l’onglet actif.

Chaque page d’onglet (et chaque extension) s’exécute dans son propre thread. Dans une étape ci-dessous, vous allez créer un script de contenu qui est injecté dans la page d’onglet. Le script injecté envoie un message de votre fenêtre contextuelle à ce script de contenu qui s’exécute sur la page d’onglet. Le script de contenu reçoit le message, qui décrit l’image à afficher.

Étape 3 : Créer le code JavaScript contextuel pour envoyer un message

Cette étape a déjà été effectuée dans popup.js dans le dépôt MicrosoftEdge-Extensions. Si vous souhaitez créer manuellement l’extension partie 2, procédez comme suit.

Créez le popup/popup.js fichier, puis ajoutez le code suivant dans ce fichier.

Ce code envoie un message à votre script de contenu qui n’a pas encore été créé que vous devez créer et injecter momentanément dans l’onglet de votre navigateur. Pour ce faire, le code suivant ajoute un onclick événement à votre bouton d’affichage contextuel :

/popup/popup.js (initial) :

const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
  sendMessageId.onclick = function() {
    // do something
  };
}

Dans le onclick cas présent, recherchez l’onglet actuel du navigateur. Ensuite, utilisez l’API chrome.tabs.sendmessage d’extension pour envoyer un message à cet onglet.

Dans ce message, vous devez inclure l’URL de l’image que vous souhaitez afficher. Veillez à envoyer un ID unique à affecter à l’image insérée.

Pour envoyer un ID unique à attribuer à l’image insérée, deux approches différentes sont possibles :

  • Approche 1 : Laissez l’insertion de contenu JavaScript générer cet ID d’image. Nous n’utiliserons pas cette approche ici, pour des raisons qui se manifesteront plus tard.
  • Approche 2 : Générez cet ID unique ici dans popup.js, puis passez cet ID au script de contenu qui n’a pas encore été créé. Nous allons utiliser cette approche.

Le code suivant décrit le code mis à jour dans popup/popup.js. Vous transmettez également l’ID d’onglet actuel, qui sera utilisé plus loin dans cet article :

/popup/popup.js (terminé) :

const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
    sendMessageId.onclick = function() {
        chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
            chrome.tabs.sendMessage(
                tabs[0].id,
                {
                    url: chrome.runtime.getURL("images/stars.jpeg"),
                    imageDivId: `${guidGenerator()}`,
                    tabId: tabs[0].id
                },
                function(response) {
                    window.close();
                }
            );
            function guidGenerator() {
                const S4 = function () {
                    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
                };
                return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
            }
        });
    };
}

Étape 4 : Rendre votre stars.jpeg disponible à partir de n’importe quel onglet de navigateur

Cette étape a déjà été effectuée dans manifest.json du dépôt MicrosoftEdge-Extensions. Si vous souhaitez créer manuellement l’extension partie 2, procédez comme suit.

Pour rendre images/stars.jpeg disponible à partir d’un onglet de navigateur, vous devez utiliser l’API chrome.runtime.getURL .

La raison en est que vous injectez l’image à l’aide de l’attribut src de l’élément img dans la page de contenu. La page de contenu s’exécute sur un thread unique qui n’est pas le même que le thread exécutant l’extension. Vous devez exposer le fichier image statique en tant que ressource web pour qu’il fonctionne correctement.

Ajoutez une autre entrée dans le manifest.json fichier pour déclarer que l’image est disponible pour tous les onglets du navigateur.

Cette entrée est la suivante (vous devriez la voir dans le fichier complet manifest.json ci-dessous lorsque vous ajoutez la déclaration de script de contenu à venir) :

/manifest.json (partie) :

"web_accessible_resources": [
    {
      "resources": ["images/*.jpeg"],
      "matches": ["<all_urls>"]
    }
  ]

Vous avez maintenant écrit le code dans votre popup.js fichier pour envoyer un message à la page de contenu incorporée dans la page d’onglet active active.

Étape 5 : Mettre à jour votre manifest.json pour le nouveau contenu et l’accès web

Ensuite, vous allez créer et injecter la page de contenu incorporée dans la page d’onglet active active. Cette étape a déjà été effectuée dans manifest.json du dépôt MicrosoftEdge-Extensions.

Mise à jour manifest.json qui inclut et web_accessible_resourcescontent-scripts est comme suit :

/manifest.json (terminé) :

{
    "name": "NASA picture of the day viewer",
    "version": "0.0.0.1",
    "manifest_version": 3,
    "description": "An extension that uses JavaScript to insert an image at the top of the webpage.",
    "icons": {
        "16": "icons/nasapod16x16.png",
        "32": "icons/nasapod32x32.png",
        "48": "icons/nasapod48x48.png",
        "128": "icons/nasapod128x128.png"
    },
    "action": {
        "default_popup": "popup/popup.html"
    },
    "content_scripts": [
        {
            "matches": [
              "<all_urls>"
            ],
            "js": ["lib/jquery.min.js","content-scripts/content.js"]
        }
    ],
    "web_accessible_resources": [
        {
            "resources": ["images/*.jpeg"],
            "matches": ["<all_urls>"]
        }
    ]
}

L’attribut matches est défini sur <all_urls>, ce qui signifie que tous les fichiers dans content_scripts sont injectés dans toutes les pages d’onglet du navigateur lorsque chaque onglet est chargé. Les types de fichiers autorisés qui peuvent être injectés sont JavaScript et CSS. Vous avez également ajouté lib\jquery.min.js. Vous pouvez copier ce fichier à partir du dossier /lib/ du dépôt MicrosoftEdge-Extensions.

Ajouter jQuery

Cette étape a déjà été effectuée dans jquery.min.js dans le dépôt MicrosoftEdge-Extensions.

Dans les scripts de contenu que vous injectez, envisagez d’utiliser jQuery ($). Vous avez ajouté une version réduite de jQuery et l’avez placée dans votre package d’extension en tant que lib\jquery.min.js.

Ces scripts de contenu s’exécutent dans des bacs à sable individuels, ce qui signifie que le jQuery injecté dans la popup.js page n’est pas partagé avec le contenu.

Présentation du thread

Même si javaScript s’exécute sur l’onglet du navigateur sur la page web chargée, tout contenu injecté n’a pas accès à ce Code JavaScript. Le Code JavaScript injecté a uniquement accès au DOM réel qui est chargé dans cet onglet de navigateur.

Étape 6 : Ajouter l’écouteur de message de script de contenu

Pour continuer à créer manuellement la démonstration de la partie 2, vous devez créer ce fichier. Cette étape a déjà été effectuée dans content.js dans le dépôt MicrosoftEdge-Extensions.

Voici le content-scripts\content.js fichier qui est injecté dans chaque page d’onglet du navigateur en fonction de la content-scripts section dans manifest.json:

/content-scripts/content.js (terminé) :

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    $("body").prepend(
        `<img  src="${request.url}" id="${request.imageDivId}"
               class="slide-image" /> `
    );
    $("head").prepend(
        `<style>
          .slide-image {
              height: auto;
              width: 100vw;
          }
        </style>`
    );
    $(`#${request.imageDivId}`).click(function() {
        $(`#${request.imageDivId}`).remove(`#${request.imageDivId}`);
    });
    sendResponse({ fromcontent: "This message is from content.js" });
});

Tout ce que fait JavaScript ci-dessus est d’inscrire un listener à l’aide de la méthode d’API d’extension chrome.runtime.onMessage.addListener . Cet écouteur attend des messages comme celui que vous avez envoyé à partir du popup.js décrit précédemment avec la méthode d’API d’extension chrome.tabs.sendMessage .

Le premier paramètre de la addListener méthode est une fonction dont le premier paramètre, request, est les détails du message transmis. N’oubliez pas que, à partir de popup.js, lorsque vous avez utilisé la sendMessage méthode , les attributs du premier paramètre sont url et imageDivId.

Lorsqu’un événement est traité par l’écouteur, la fonction qui est le premier paramètre est exécutée. Le premier paramètre de cette fonction est un objet qui a des attributs attribués par sendMessage. Cette fonction traite simplement les trois lignes de script jQuery.

  • La première ligne de script ajoute un img élément juste sous l’onglet body de votre navigateur auquel la slide-image classe est affectée, ainsi que l’ID imageDivId de cet élément d’image.

  • La deuxième ligne de script insère dynamiquement dans l’en-tête DOM une <section de style> que vous devez affecter en tant slide-image que classe à votre img élément.

  • La troisième ligne de script ajoute un click événement qui couvre l’image entière, ce qui permet à l’utilisateur de sélectionner n’importe où sur l’image et cette image est supprimée de la page (avec l’écouteur d’événements).

Étape 7 : Installer et tester l’extension

  1. Installez ou mettez à jour l’extension dans la page Gérer les extensions ; Consultez Charger une extension pour l’installer et la tester localement.

  2. Accédez à une page web, telle que Microsoft.com, dans une nouvelle fenêtre ou un nouvel onglet. L’onglet ne doit pas être vide et ne doit pas être la page Gérer les extensions.

  3. Cliquez sur le bouton Extensions (icône Extensions), en regard de la barre d’adresses. Vous pouvez également sélectionner Paramètres et plus encore (...) >Extensions.

    Cliquez sur l’icône de l’extension pour ouvrir l’extension

  4. Cliquez sur l’icône ou le nom de l’image de la NASA de l’extension d’observateur de jour .

    La fenêtre contextuelle de l’extension s’ouvre :

    popup.html'affichage après avoir sélectionné l’icône Extension

  5. Cliquez sur le bouton Afficher . stars.jpeg est inséré en haut de la page web active sous l’onglet actif, en poussant le contenu de la page web vers le bas sous l’image :

    Image affichée dans le navigateur

  6. Cliquez sur l’image stars.jpeg qui remplit la partie supérieure de la page web. Cet élément d’image est supprimé de l’arborescence dom et de la page web, et la page web actuelle est restaurée, en déplaçant son contenu vers le haut de l’onglet.

Félicitations ! Vous avez créé une extension qui envoie un message à partir de la fenêtre contextuelle de l’icône d’extension et insère dynamiquement JavaScript en tant que contenu dans l’onglet du navigateur. Le contenu injecté définit l’élément image à afficher stars.jpeg en haut de la page web active, puis supprime l’image lorsque vous cliquez sur l’image.

Voir aussi

GitHub :