Vorne geschriebenIch habe fast einen Monat gebraucht, um diesen Blogbeitrag zu schreiben, und habe dabei sorgfältig eine vollständige Demo geschrieben. Jeder weiß, wie schwierig es ist, einen Blog zu schreiben. Achten Sie daher beim Nachdruck darauf, die Quelle beizubehalten. Die meisten der in diesem Artikel enthaltenen Codes befinden sich in dieser Demo: https://github.com/sxei/chrome-plugin-demo. Sie können sie herunterladen und direkt ausführen. Darüber hinaus enthält dieser Artikel viele Bilder und die Bandbreite des Bildservers ist begrenzt. Die Überwachung des Verzeichnis-Scrollings in der unteren rechten Ecke muss warten, bis alle Bilder geladen sind, bevor sie ausgelöst wird. Warten Sie also bitte geduldig, bis der Ladevorgang abgeschlossen ist. Inhalt dieses Artikels: Einige Screenshots der Demo: VorwortWas ist ein Chrome-Plugin? Genau genommen sollte das, worüber wir sprechen, als Das Chrome-Plug-in ist eine mit Webtechnologie entwickelte Software zur Verbesserung der Browserfunktionen. Es handelt sich eigentlich um ein komprimiertes Paket mit der Endung .crx, das aus HTML, CSS, JS, Bildern und anderen Ressourcen besteht. Ich vermute, dass Darüber hinaus handelt es sich nicht nur um Front-End-Technologie. Chrome-Plug-Ins können auch mit in C++ geschriebenen DLL-Dynamic-Link-Bibliotheken zusammenarbeiten, um einige Funktionen auf niedrigerer Ebene (NPAPI) zu implementieren, z. B. Vollbild-Screenshots. Aus Sicherheitsgründen unterstützen die Chrome-Browserversionen 42 und höher keine NPAPI-Plug-Ins mehr und haben diese durch das sicherere PPAPI ersetzt. Welche Bedeutung hat es, die Entwicklung von Chrome-Plug-ins zu erlernen?Erweitern Sie die Browserfunktionalität, erstellen Sie ganz einfach Ihren eigenen „angepassten“ Browser und vieles mehr. Das Chrome-Plugin stellt uns viele nützliche APIs zur Verfügung, unter anderem:
Warum ein Chrome-Plugin statt eines Firefox-Plugins?
Entwicklung und Debugging Das Chrome-Plug-In stellt keine strengen Anforderungen an die Projektstruktur. Solange sich in diesem Verzeichnis eine Sie können die Plug-In-Verwaltungsseite über das Menü oben rechts -> Weitere Tools -> Erweiterungen aufrufen oder direkt „chrome://extensions“ in die Adressleiste eingeben, um darauf zuzugreifen. Aktivieren Sie Während der Entwicklung muss bei jeder Änderung am Code das Plugin neu geladen werden. Drücken Sie dazu einfach Kerneinführungmanifest.json Dies ist die wichtigste und wesentlichste Datei eines Chrome-Plug-Ins. Sie wird zum Konfigurieren aller Plug-In-bezogenen Konfigurationen verwendet und muss im Stammverzeichnis abgelegt werden. Davon sind Nachfolgend finden Sie einige allgemeine Konfigurationselemente, alle mit chinesischen Kommentaren. Klicken Sie hier, um das vollständige Konfigurationsdokument anzuzeigen. { // Die Version der Manifestdatei, diese muss geschrieben werden und muss 2 sein "manifest_version": 2, // Der Name des Plugins "name": "demo", //Version des Plugins "version": "1.0.0", // Plugin-Beschreibung "description": "Einfache Chrome-Erweiterungsdemo", // Symbole, es ist in Ordnung, einfach eine Größe für alle Symbole zu verwenden „Symbole“: { "16": "img/icon.png", "48": "img/icon.png", "128": "img/icon.png" }, // Hintergrund-JS oder Hintergrundseite, die immer vorhanden sein wird „Hintergrund“: { // 2 Möglichkeiten zur Angabe. Wenn Sie JS angeben, wird automatisch eine Hintergrundseite generiert: "page": "background.html" //"Skripte": ["js/background.js"] }, // In den Browsersymboleinstellungen oben rechts, browser_action, page_action, app muss „browser_action“ ausgewählt sein: { "Standardsymbol": "img/icon.png", // Der Titel, wenn über das Symbol gefahren wird, optional „default_title“: „Dies ist ein Beispiel-Chrome-Plugin“, "default_popup": "popup.html" }, // Icons, die nur angezeigt werden, wenn bestimmte Seiten geöffnet werden /*"page_action": { "Standardsymbol": "img/icon.png", "default_title": "Ich bin pageAction", "default_popup": "popup.html" },*/ // Muss JS direkt in die Seite einfügen "Inhaltsskripte": [ { //"Übereinstimmungen": ["http://*/*", "https://*/*"], // "<all_urls>" bedeutet, dass alle Adressen übereinstimmen "matches": ["<all_urls>"], // Mehrere JS werden nacheinander eingefügt "js": ["js/jquery-1.8.3.js", "js/content-script.js"], // Sie können JS nach Belieben einfügen, aber bei CSS müssen Sie vorsichtig sein, da es den globalen Stil beeinträchtigen kann, wenn Sie nicht aufpassen "css": ["css/custom.css"], // Zeit für Code-Injektion, optionale Werte: „document_start“, „document_end“ oder „document_idle“, letzterer bedeutet, wenn die Seite im Leerlauf ist, der Standardwert ist „document_idle“. "run_at": "Dokumentstart" }, // Dies dient nur zur Demonstration, dass content-script mit mehreren Regeln konfiguriert werden kann { "Übereinstimmungen": ["*://*/*.png", "*://*/*.jpg", "*://*/*.gif", "*://*/*.bmp"], "js": ["js/Bildinhaltsgröße anzeigen.js"] } ], // Berechtigungsanwendung „permissions“: [ "contextMenus", // Rechtsklickmenü "tabs", // Tags "notifications", // Benachrichtigungen "webRequest", // Web-Anfrage "webRequestBlocking", "storage", // Lokaler Speicher des Plugins "http://*/*", // Websites auf die über executeScript oder insertCSS zugegriffen werden kann "https://*/*" // Websites auf die über executeScript oder insertCSS zugegriffen werden kann ], // Liste der Plugin-Ressourcen, auf die von normalen Seiten direkt zugegriffen werden kann. Wenn sie nicht festgelegt sind, können sie nicht direkt aufgerufen werden "web_accessible_resources": ["js/inject.js"], // Plugin-Homepage, das ist sehr wichtig, verschwenden Sie diesen kostenlosen Werbeplatz nicht "homepage_url": "https://www.baidu.com", // Überschreibe die Standardseite des Browsers „chrome_url_overrides“: { // Überschreibe die standardmäßige neue Tab-Seite des Browsers „newtab“: „newtab.html“ }, // So schreiben Sie die Plugin-Konfigurationsseite vor Chrome 40 "options_page": "options.html", // So schreiben Sie die Plugin-Konfigurationsseite in Chrome 40 und höher. Wenn Sie beide schreiben, erkennt die neue Version von Chrome nur die letztere „options_ui“: { "Seite": "Optionen.html", // Fügen Sie einige Standardstile hinzu. Es wird empfohlen, "chrome_style" zu verwenden: true }, // Tragen Sie ein Schlüsselwort in die Adressleiste ein, um Suchvorschläge bereitzustellen. Es kann nur ein Schlüsselwort festgelegt werden: "omnibox": { "keyword" : "go" }, // Standardsprache "default_locale": "zh_CN", // devtools-Seiteneintrag, beachten Sie, dass er nur auf eine HTML-Datei verweisen kann, nicht auf eine JS-Datei "devtools_page": "devtools.html" } Inhaltsskripte Die sogenannten Inhaltsskripte sind eigentlich eine Art Skripteinfügung in die Seite im Chrome-Plug-In (obwohl es Skript genannt wird, kann es tatsächlich CSS enthalten). Mithilfe von Beispielkonfiguration: { // Muss JS direkt in die Seite einfügen "Inhaltsskripte": [ { //"Übereinstimmungen": ["http://*/*", "https://*/*"], // "<all_urls>" bedeutet, dass alle Adressen übereinstimmen "matches": ["<all_urls>"], // Mehrere JS werden nacheinander eingefügt "js": ["js/jquery-1.8.3.js", "js/content-script.js"], // Sie können JS nach Belieben einfügen, aber bei CSS müssen Sie vorsichtig sein, da es den globalen Stil beeinträchtigen kann, wenn Sie nicht aufpassen "css": ["css/custom.css"], // Zeit für Code-Injektion, optionale Werte: „document_start“, „document_end“ oder „document_idle“, letzterer bedeutet, wenn die Seite im Leerlauf ist, der Standardwert ist „document_idle“. "run_at": "Dokumentstart" } ], } Beachten Sie, dass der folgende Code nicht funktioniert, wenn document.addEventListener('DOMContentLoaded', Funktion() { console.log('Ich wurde hingerichtet!'); });
Seien Sie nicht pessimistisch, wenn Sie das sehen. Diese APIs reichen in den meisten Fällen aus. Wenn Sie wirklich andere APIs aufrufen müssen, können Sie auch die Kommunikation nutzen, um sich beim Aufruf vom Hintergrund helfen zu lassen (mehr zur Kommunikation später). Nun, das Chrome-Plug-In stellt uns eine solch leistungsstarke JS-Injektionsfunktion zur Verfügung. Der Rest besteht darin, Ihrer Fantasie freien Lauf zu lassen und mit dem Browser zu spielen. HintergrundDer Hintergrund (übersetzen wir es so) ist eine permanente Seite mit dem längsten Lebenszyklus aller Seitentypen im Plug-In. Sie wird geöffnet, wenn der Browser geöffnet wird, und geschlossen, wenn der Browser geschlossen wird. Daher wird der globale Code, der ständig ausgeführt werden muss und beim Start ausgeführt wird, normalerweise im Hintergrund platziert. Der Hintergrund verfügt über sehr hohe Berechtigungen und kann fast alle Chrome-Erweiterungs-APIs aufrufen (außer Devtools) und er kann ohne Einschränkungen auf alle Websites domänenübergreifend zugreifen, das heißt, er kann auf alle Websites domänenübergreifend zugreifen, ohne dass die andere Partei Nach dem Testen ist dies nicht nur im Hintergrund der Fall, sondern auf allen Webseiten, die direkt über In der Konfiguration kann { // Hintergrund-JS oder Hintergrundseite, die immer vorhanden sein wird „Hintergrund“: { // 2 Möglichkeiten zur Angabe. Wenn Sie JS angeben, wird automatisch eine Hintergrundseite generiert: "page": "background.html" //"Skripte": ["js/background.js"] }, } Es ist zu beachten, dass Sie zwar die Hintergrundseite direkt über Veranstaltungsseiten Hier möchte ich event-pages vorstellen. Was ist das? Da der Lebenszyklus des Hintergrunds zu lang ist, kann eine lange Einbindung des Hintergrunds die Leistung beeinträchtigen. Aus diesem Grund hat Google { "Hintergrund": { "Skripte": ["event-page.js"], "persistent": falsch }, } Sein Lebenszyklus ist: geladen, wenn benötigt, und geschlossen, wenn inaktiv. Was bedeutet es, wenn es benötigt wird? Beispielsweise die Erstinstallation, das Update des Plugins, das Senden von Nachrichten durch Inhaltsskripts usw. Neben den Änderungen in den Konfigurationsdateien gibt es auch einige kleinere Änderungen im Code. Ich muss sie mir nur kurz ansehen. Im Allgemeinen wird der Hintergrund nicht viel Leistung verbrauchen. aufpoppen Konfigurationsmethode: { "Browseraktion": { "Standardsymbol": "img/icon.png", // Der Titel, wenn über das Symbol geschwebt wird, optional „default_title“: „Dies ist ein Beispiel-Chrome-Plugin“, "default_popup": "popup.html" } } Es ist wichtig zu beachten, dass der Lebenszyklus einer Popup-Seite im Allgemeinen sehr kurz ist, da ein Popup durch Klicken auf ein Symbol geöffnet und sofort geschlossen wird, wenn der Fokus entfernt wird. Code, der lange ausgeführt werden muss, sollte niemals in ein Popup geschrieben werden. In Bezug auf Berechtigungen ist es dem Hintergrund sehr ähnlich. Der größte Unterschied zwischen ihnen ist der Unterschied im Lebenszyklus. Im Popup können Sie das Hintergrundfensterobjekt direkt über injiziertes Skript Dies liegt daran, dass Im // JS in die Seite einfügen Funktion injectCustomJs(jsPath) { jsPath = jsPath || 'js/inject.js'; var temp = document.createElement('Skript'); temp.setAttribute('Typ', 'Text/Javascript'); // Die erhaltene Adresse ähnelt: chrome-extension://ihcokhadfjfchaeagdoclpnjdiokfakg/js/inject.js temp.src = chrome.extension.getURL(jsPath); temp.onload = Funktion () { // Es sieht auf der Seite nicht gut aus, entfernen Sie es nach der Ausführung this.parentNode.removeChild(this); }; Dokument.Kopf.AnhängenUntergeordnetesElement(temp); } Meinen Sie, das ist alles? Wenn Sie es ausführen, wird der folgende Fehler angezeigt:
Das bedeutet, wenn Sie direkt auf die Ressourcen im Plugin im Web zugreifen möchten, müssen Sie dies explizit deklarieren. Fügen Sie der Konfigurationsdatei Folgendes hinzu: { // Liste der Plugin-Ressourcen, auf die von normalen Seiten direkt zugegriffen werden kann. Wenn sie nicht festgelegt sind, können sie nicht direkt aufgerufen werden "web_accessible_resources": ["js/inject.js"], } Wie Homepage-URLDie Homepage-Einstellungen des Entwicklers oder Plugins werden im Allgemeinen an den folgenden zwei Stellen angezeigt: 8 Anzeigemodi des Chrome-Plug-InsBrowserAction (obere rechte Ecke des Browsers) Durch Konfigurieren von Die Beispielkonfiguration sieht wie folgt aus: "Browseraktion": { "Standardsymbol": "img/icon.png", "default_title": "Dies ist ein Beispiel-Plug-in für Chrome", "default_popup": "popup.html" } Symbol Für das Tooltip Ändern Sie das Feld Abzeichen Das sogenannte chrome.browserAction.setBadgeText({text: 'neu'}); chrome.browserAction.setBadgeBackgroundColor({color: [255, 0, 0, 255]}); Wirkung: pageAction (rechte Seite der Adressleiste) Bei der sogenannten Es ist zu beachten, dass frühere Versionen von Chrome pageAction ganz rechts in der Adressleiste platzierten. Wenn Sie mit der linken Maustaste darauf klicken, wird ein Popup-Fenster geöffnet, und wenn Sie mit der rechten Maustaste darauf klicken, wird ein Standardoptionsmenü angezeigt: Die neue Version von Chrome hat diese Strategie geändert. PageAction wird wie die normale BrowserAction in der oberen rechten Ecke des Browsers platziert, ist jedoch grau, wenn es nicht leuchtet, und bunt, wenn es leuchtet. Wenn es grau ist, werden Optionen angezeigt, egal ob Sie mit der linken oder rechten Maustaste klicken: Ich habe nicht im Detail untersucht, in welcher Version die Änderung begann, aber ich weiß, dass es in v50.0 noch Ersteres war und in v58.0 auf Letzteres geändert wurde. Nach der Anpassung können wir
Beispiel (das Symbol wird nur angezeigt, wenn Baidu geöffnet ist): // manifest.json { "Seitenaktion": { "Standardsymbol": "img/icon.png", "default_title": "Ich bin pageAction", "default_popup": "popup.html" }, "Berechtigungen": ["deklarativer Inhalt"] } // Hintergrund.js chrome.runtime.onInstalled.addListener(Funktion(){ chrome.declarativeContent.onPageChanged.removeRules(undefiniert, Funktion(){ chrome.declarativeContent.onPageChanged.addRules([ { Bedingungen: [ // Erst wenn Baidu geöffnet wird, wird pageAction angezeigt neues chrome.declarativeContent.PageStateMatcher({pageUrl: {urlContains: 'baidu.com'}}) ], Aktionen: [neuer chrome.declarativeContent.ShowPageAction()] } ]); }); }); Effektbild: Rechtsklickmenü Durch die Entwicklung eines Chrome-Plug-Ins können Sie das Rechtsklickmenü des Browsers anpassen, hauptsächlich über Das einfachste Rechtsklickmenü-Beispiel// manifest.json {"Berechtigungen": ["Kontextmenüs"]} // Hintergrund.js chrome.contextMenus.create({ Titel: "Rechtsklickmenü testen", onclick: function(){alert('Sie haben auf das Rechtsklickmenü geklickt!');} }); Wirkung: Rechtsklick-Baidu-Suche hinzufügen// manifest.json {"Berechtigungen": ["Kontextmenüs", "Registerkarten"]} // Hintergrund.js chrome.contextMenus.create({ Titel: „Verwenden Sie Baidu zum Suchen: %s“, // %s zeigt den ausgewählten Text an Kontexte: [„Auswahl“], // Dieses Rechtsklickmenü wird nur angezeigt, wenn ein Text ausgewählt ist onclick: Funktion (Parameter) { // Beachten Sie, dass location.href nicht verwendet werden kann, da location ein Fensterobjekt ist, das zum Hintergrund gehört chrome.tabs.create({url: 'https://www.baidu.com/s?ie=utf-8&wd=' + encodeURI(params.selectionText)}); } }); Die Wirkung ist wie folgt: SyntaxHier sind nur einige gängige. Die vollständige API finden Sie unter: https://developer.chrome.com/extensions/contextMenus chrome.contextMenus.create({ Typ: „normal“, // Typ, optional: [„normal“, „Kontrollkästchen“, „Radio“, „Trennzeichen“], Standard normal Titel: 'Menüname', // Der angezeigte Text, es sei denn, der Typ ist "Trennzeichen", dieser Parameter ist erforderlich. Wenn der Typ "Auswahl" ist, können Sie %s verwenden, um den ausgewählten Text anzuzeigen Kontexte: ['Seite'], // Kontext, optional: ["alles", "Seite", "Rahmen", "Auswahl", "Link", "bearbeitbar", "Bild", "Video", "Audio"], Standardseite onclick: function(){}, // Methode, die beim Klicken ausgelöst wird parentId: 1, // ID des übergeordneten Menüelements des Rechtsklickmenüelements. Durch die Angabe eines übergeordneten Menüelements wird dieses Menüelement zu einem Untermenü des übergeordneten Menüelements. documentUrlPatterns: 'https://*.baidu.com/*' // Dieses Rechtsklickmenü nur auf bestimmten Seiten anzeigen}); // Ein Menüelement löschen chrome.contextMenus.remove(menuItemId); // Alle benutzerdefinierten Rechtsklickmenüs löschen chrome.contextMenus.removeAll(); // Ein Menüelement aktualisieren chrome.contextMenus.update(menuItemId, updateProperties); überschreiben (eine bestimmte Seite überschreiben) Mithilfe der Die Erweiterung kann folgende Seiten ersetzen:
Beachten:
Die folgenden Screenshots zeigen die standardmäßige neue Registerkarte und die durch die Erweiterung ersetzte neue Registerkarte. Code (beachten Sie, dass ein Plugin nur eine Standardseite ersetzen kann, das Folgende dient nur zur Demonstration): "chrome_url_overrides": { "newtab": "newtab.html", "Geschichte": "Geschichte.html", "Lesezeichen": "Lesezeichen.html" } EntwicklertoolsVorheizenWer Vue verwendet hat, dürfte diese Art von Plug-In gesehen haben: Ja, Chrome erlaubt es Plugins, Entwicklertools (Devtools) zu manipulieren, hauptsächlich auf folgende Weise:
Schauen wir uns zunächst zwei einfache Demo-Screenshots an, benutzerdefinierte Bedienfelder (um festzustellen, ob auf der aktuellen Seite jQuery verwendet wird): Passen Sie die Seitenleiste an (alle Bilder der aktuellen Seite abrufen): Einführung in die devtools-ErweiterungHomepage: https://developer.chrome.com/extensions/devtools Hier ist ein offizielles Bild: Jedes Mal, wenn ein Entwicklertoolfenster geöffnet wird, wird eine Instanz der Devtools-Seite erstellt. Wenn das F12-Fenster geschlossen wird, wird auch die Seite geschlossen, sodass der Lebenszyklus der Devtools-Seite mit dem Devtools-Fenster übereinstimmt. Die DevTools-Seite kann auf eine Reihe einzigartiger
Die meisten Erweiterungs-APIs können nicht direkt von der Beispiel: Erstellen einer Devtools-ErweiterungUm ein Plug-In für die Entwicklertools zu entwickeln, müssen Sie zunächst Folgendes in der Manifestdatei deklarieren: { // Kann nur auf eine HTML-Datei verweisen, nicht auf eine JS-Datei "devtools_page": "devtools.html" } Diese <!DOCTYPE html> <html> <Kopf></Kopf> <Text> <script type="text/javascript" src="js/devtools.js"></script> </body> </html> Es ist ersichtlich, dass der eigentliche Code Schauen wir uns den Code von devtools.js an: // Erstellen Sie ein benutzerdefiniertes Panel. Das gleiche Plug-In kann mehrere benutzerdefinierte Panels erstellen. // Die Parameter sind: Paneltitel, Symbol (eigentlich gibt es keinen Platz, um es anzuzeigen), zu ladende Seite, Rückruf nach erfolgreichem Laden chrome.devtools.panels.create('MyPanel', 'img/icon.png', 'mypanel.html', function(panel) { console.log('Benutzerdefiniertes Panel erfolgreich erstellt!'); // Beachten Sie, dass dieses Protokoll normalerweise nicht sichtbar ist}); // Erstellen Sie eine benutzerdefinierte Seitenleiste chrome.devtools.panels.elements.createSidebarPane("Bilder", function(sidebar) { // sidebar.setPage('../sidebar.html'); // Eine zu ladende Seite angeben sidebar.setExpression('document.querySelectorAll("img")', 'Alle Bilder'); // Durch Ausdruck angeben //sidebar.setObject({aaa: 111, bbb: 'Hallo Welt!'}); // Anzeige eines Objekts direkt festlegen}); Die Wirkung von setPage: Der folgende Screenshot zeigt den Code: // jQuery erkennen document.getElementById('check_jquery').addEventListener('klicken', function() { // Der Zugriff auf das DOM der untersuchten Seite erfordert die Verwendung von inspectedWindow // Einfaches Beispiel: Überprüfen Sie, ob die zu überprüfende Seite jQuery verwendet chrome.devtools.inspectedWindow.eval("jQuery.fn.jquery", Funktion(Ergebnis, isException) { var html = ''; if (isException) html = 'Die aktuelle Seite verwendet kein jQuery. '; sonst html = 'Die aktuelle Seite verwendet jQuery, die Version ist:' + result; Alarm (HTML); }); }); //Öffnen Sie ein Ressourcendokument.getElementById('open_resource').addEventListener('click', function() { chrome.devtools.inspectedWindow.eval("window.location.href", Funktion(Ergebnis, istAusnahme) { chrome.devtools.panels.openResource(Ergebnis, 20, Funktion() { console.log('Ressource erfolgreich geöffnet!'); }); }); }); //Element überprüfen document.getElementById('test_inspect').addEventListener('click', function() { chrome.devtools.inspectedWindow.eval("inspect(document.images[0])", Funktion(Ergebnis, istAusnahme){}); }); // Alle Ressourcen abrufen document.getElementById('get_all_resources').addEventListener('click', function() { chrome.devtools.inspectedWindow.getResources(Funktion(Ressourcen) { Alarm (JSON.stringify (Ressourcen)); }); }); Tipps zur Fehlerbehebung Wenn Sie den Code auf der Devtools-Seite ändern, müssen Sie auf der Seite „chrome://extensions“ Da devtools selbst eine Entwicklertoolseite ist, gibt es fast keine Möglichkeit, sie direkt zu debuggen. Das direkte Öffnen der Seite über Option (Optionsseite) Die sogenannte Vor Chrome 40 unterschied sich die Optionsseite nicht von anderen normalen Seiten, nach Chrome 40 gab es jedoch einige Änderungen. Schauen wir uns zunächst die alte Version der Optionen an: { // So schreiben Sie die Plugin-Konfigurationsseite vor Chrome 40 "options_page": "options.html", } Der Inhalt dieser Seite bleibt Ihnen überlassen. Nach der Konfiguration wird auf der Plug-In-Verwaltungsseite ein Wirkung: Schauen wir uns die neue Version von optionsV2 an: { "Optionen_UI": { "Seite": "Optionen.html", // Fügen Sie einige Standardstile hinzu. Es wird empfohlen, "chrome_style" zu verwenden: true }, } Wir haben den Code von Sieht es nicht groß und majestätisch aus? Einige Anmerkungen:
Omnibox Registrieren Sie ein Schlüsselwort, um die Suchvorschlagsschnittstelle des Plugins auszulösen, und dann können Sie damit machen, was Sie wollen. Zunächst sieht die Konfigurationsdatei wie folgt aus: { // Tragen Sie ein Schlüsselwort in die Adressleiste ein, um Suchvorschläge bereitzustellen. Es kann nur ein Schlüsselwort festgelegt werden: "omnibox": { "keyword" : "go" }, } Registrieren Sie dann das Listener-Ereignis in // Omnibox-Demo chrome.omnibox.onInputChanged.addListener((text, suggest) => { console.log('inputChanged: ' + text); wenn(!text) zurückgeben; wenn(text == 'Schönheit') { vorschlagen([ {content: '中国' + text, description: 'Suchen Sie nach „chinesischen Schönheiten“? '}, {content: '日本' + text, description: 'Suchen Sie nach „japanischen Schönheiten“? '}, {content: 'Thailand' + text, description: 'Suchen Sie nach „thailändischen Schönheiten oder Ladyboys“? '}, {content: '韩国' + text, description: 'Suchen Sie nach „koreanischen Schönheiten“? '} ]); } sonst wenn(Text == 'Weibo') { vorschlagen([ {Inhalt: 'Sina' + Text, Beschreibung: 'Sina' + Text}, {Inhalt: 'Tencent' + Text, Beschreibung: 'Tencent' + Text}, {Inhalt: 'Sohu' + Text, Beschreibung: 'Suche' + Text}, ]); } anders { vorschlagen([ {Inhalt: ‚Baidu-Suche‘ + Text, Beschreibung: ‚Baidu-Suche‘ + Text}, {Inhalt: 'Google-Suche' + Text, Beschreibung: 'Google-Suche' + Text}, ]); } }); // Wird ausgelöst, wenn der Benutzer Schlüsselwortvorschläge erhält chrome.omnibox.onInputEntered.addListener((text) => { console.log('inputEntered: ' + text); wenn(!text) zurückgeben; var href = ''; if(text.endsWith('Suche')) href = 'http://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=' + text; sonst wenn (text.startsWith('Baidu-Suche')) href = 'https://www.baidu.com/s?ie=UTF-8&wd=' + text.replace('Baidu-Suche', ''); sonst wenn (text.startsWith('Google-Suche')) href = 'https://www.google.com.tw/search?q=' + text.replace('Google-Suche', ''); sonst href = 'https://www.baidu.com/s?ie=UTF-8&wd=' + Text; öffneUrlCurrentTab(href); }); // Aktuelle Tab-ID abrufen Funktion getCurrentTabId(Rückruf) { chrome.tabs.query({aktiv: true, aktuellesFenster: true}, Funktion(Tabs) { wenn (Rückruf) Rückruf (Tabs.Länge? Tabs[0].id: null); }); } //Öffnen Sie einen Link in der aktuellen Registerkarte Funktion openUrlCurrentTab(url) { getCurrentTabId(tabId => { chrome.tabs.update(tabId, {url: url}); }) } Desktop-Benachrichtigungen Chrome liefert eine Im Hintergrund JS, unabhängig davon, ob Sie Die einfachste Benachrichtigung: Code: chrome.notifications.create (null, {{ Typ: 'grundlegend', iconurl: 'img/icon.png', Titel: 'Dies ist der Titel', Nachricht: 'Sie haben gerade auf das Menü mit dem benutzerdefinierten Klick geklickt! ' }); Die Benachrichtigungsstile können sehr reich sein: Dies wurde nicht ausführlich untersucht. Sie können die offizielle Dokumentation lesen, wenn Sie sie benötigen. Vergleich von 5 Arten von JS Chrome Plug-In JS kann hauptsächlich in diese fünf Kategorien unterteilt werden: Erlaubnisvergleich
Vergleich der Debugging -Methoden
NachrichtenkommunikationMessaging -Homepage: https://developer.chrome.com/extensions/messaging Früher haben wir die fünf Arten von JS in Chrome-Plug-Ins eingeführt. Wie kommunizieren sie also miteinander? Lassen Sie uns zuerst einen Überblick über das System geben und dann die Kategorien im Detail erläutern. Was Sie wissen müssen, ist, dass Popup und Hintergrund tatsächlich als fast dasselbe angesehen werden können, da sie die gleiche zugängliche API, den gleichen Kommunikationsmechanismus haben und Domänen überqueren können. Überblick über die gegenseitige Kommunikation HINWEIS:
7.2Popup und HintergrundDas Popup kann die JS -Methode direkt im Hintergrund aufrufen oder direkt auf das DOM des Hintergrunds zugreifen: // Hintergrund.js Funktionstest () { Alarm ('Ich bin Hintergrund!'); } // popup.js var bg = chrome.extesion.getbackgroundPage (); bg.test (); Eine kleine Episode, die ich heute auf eine Situation gestoßen bin und festgestellt habe, dass das Popup nach langer Zeit keine Methode des Hintergrunds erhalten konnte. var views = chrome.extension.getViews ({type: 'popup'}); if (views.length> 0) { console.log (Ansichten [0] .Location.href); } Popup oder BG sendet aktiv Nachrichten an Inhalte Hintergrund.js oder popup.js: Funktion sendMessAgetocontententscript (Nachricht, Rückruf) { chrome.tabs.query ({active: true, currentWindow: true}, Funktion (Registerkarten) { Chrome.Tabs.SendMessage (Registerkarten [0] .ID, Nachricht, Funktion (Antwort) { if (Rückruf) Rückruf (Antwort); }); }); } sendMessAgetocontentscript ({CMD: 'Test', Wert: 'Hallo, ich bin Popup!'}, Funktion (Antwort) { console.log ('Antwort aus Inhalt:'+Antwort); }); chrome.runtime.onmessage.addListener (Funktion (Anfrage, Absender, SendResponse) { // console.log (sender.tab? "Aus einem Inhaltskript:" + sender.tab.url: "Aus der Erweiterung"); if (request.cmd == 'test') alarm (request.Value); sendResponse ('Ich habe deine Nachricht erhalten!'); }); Was direkt von beiden Parteien in der Kommunikation gesendet wird, sind JSON -Objekte, nicht von JSON -Zeichenfolgen, sodass sie nicht analysieren müssen, was sehr bequem ist (natürlich können Saiten auch direkt gesendet werden). Einige Das Inhaltskript sendet aktiv Nachrichten an den Hintergrundcontent-script.js: chrome.runtime.sendMessage ({Begrüßung: 'Hallo, ich bin inhalts-skript, ich werde eine Nachricht an das Backend senden!'}, Funktion (Antwort) { console.log ('erhielt eine Antwort aus dem Backend:' + Antwort); }); Hintergrund.js oder popup.js: // Anhören Sie Nachrichten von Content-script chrome.runtime.onmessage.addListener (Funktion (Anfrage, Absender, SendResponse) { console.log ('Empfangen Sie eine Nachricht von Inhaltskript:'); console.log (Anfrage, Absender, SendResponse); SendResponse ('Ich bin das Backend, ich habe Ihre Nachricht erhalten:' + json.Stringify (Anfrage)); }); Notiz:
injiziertes Skript und Inhaltskript Das einzige, was zwischen
Die erste Methode (empfohlen): In window.postMessage ({"test": 'Hallo!'}, '*'); Im Inhaltskript: window.addeventListener ("meldung", function (e) { console.log (e.data); }, FALSCH); Zweite Methode: In var CustOperEvent = document.createEvent ('Ereignis'); CustoMevent.initevent ('mycustomevent', wahr, wahr); Funktion firecustomevent (data) { hiddendiv = document.getElementById ('mycustomeventDiv'); Hiddendiv.Innertext = Daten Hiddendiv.DispatchEvent (CustOMevent); } Firecustomevent ('Hallo, ich bin gewöhnlich JS!'); In var hiddendiv = document.getElementById ('mycustomeventDiv'); if (! Hiddendiv) { hiddendiv = document.createelement ('div'); hiddendiv.style.display = 'none'; document.body.appendchild (hiddendiv); } hiddendiv.addeventListener ('mycustomevent', function () { var eventData = document.getElementById ('mycustomeventDiv'). InnerText; console.log ('empfangene benutzerdefinierte Ereignisnachricht:' + eventData); }); Lange und kurze Verbindungen Tatsächlich wurde dies oben erwähnt, also werde ich es hier getrennt erklären. Es gibt zwei Kommunikationsmethoden im Chrome-Plug-In, eines ist eine kurze Verbindung ( Eine kurze Verbindung ist wie eine Es gibt bereits Codebeispiele für kurze Verbindungen. Hier werden wir nur über lange Verbindungen sprechen. popup.js: getCurrentTabid ((tabid) => { var port = chrome.tabs.connect (Tabid, {Name: 'Test-Connect'}); Port.PostMessage ({Frage: 'Wer bist du?'}); port.onmessage.addListener (Funktion (msg) { alert ('empfangene Nachricht:' + msg.answer); if (msg.answer && msg.answer.startswith ('i bin')) { Port.PostMessage ({Frage: 'Oh, du bist es!'}); } }); }); content-script.js: // Hören Sie für Long Connections chrome.runtime.onconnect.addListener (Funktion (Port) { console.log (port); if (port.name == 'Test-Connect') { port.onmessage.addListener (Funktion (msg) { console.log ('empfangene Long -Verbindungsnachricht:', msg); if (msg.question == 'Wer bist du?') postMessage ({Antwort: 'Ich bin dein Vater!'}); }); } }); Andere ErgänzungenJs dynamisch injizieren oder ausführen Obwohl die Seite DOM nicht direkt im Beispiel { "Name": "Dynamische JS -Injektion Demonstration", ... "Berechtigungen": [ "tabs", "http: //*/*", "https: //*/*" ], ... } JS: // Dynamisch js code chrome.tabs.executescript (tabid, {code: 'document.body.style.backgroundcolor = "red"'}) ausführen; // Dynamisch JS-Dateien Chrome.tabs.executescript (tabid, {file: 'some-script.js'}) ausführen; Dynamisch injizieren CSS Beispiel { "Name": "Dynamische CSS -Injektion Demo", ... "Berechtigungen": [ "tabs", "http: //*/*", "https: //*/*" ], ... } JS-Code: // Dynamisch CSS -Code ausführen, todo, dies muss verifiziert werden. // CSS-Dateien dynamisch ausführen. Holen Sie sich die aktuelle Fenster -IDChrome.Windows.getCurrent (Funktion (CurrentWindow) { console.log ('aktuelle Fenster -ID:' + currentWindow.id); }); Holen Sie sich die aktuelle Registerkarte IDEs gibt im Allgemeinen 2 Methoden: // Die aktuelle Registerkarte ID abrufen Funktion getCurrentTabid (Rückruf) { chrome.tabs.query ({active: true, currentWindow: true}, Funktion (Registerkarten) { if (Rückruf) Rückruf (tabs.length? tabs [0] .ID: null); }); } Eine andere Möglichkeit, die aktuelle Registerkarten -ID zu erhalten, ist sie meistens ähnlich, nur wenige Male ist sie anders (z. B. wenn das Fenster minimiert wird) // Die aktuelle Registerkarte ID abrufen Funktion getCurrentTabid2 () { Chrome.Windows.getCurrent (Funktion (CurrentWindow) { chrome.tabs.query ({active: true, windowID: currentWindow.id}, Funktion (Registerkarten) { if (Rückruf) Rückruf (tabs.length? tabs [0] .ID: null); }); }); } Lokaler Speicher Für die lokale Speicherung wird empfohlen,
// Daten lesen. console.log (items.color, items.age); }); // Data chrome.storage.sync.set ({color: 'blau'}, function () {speichern console.log ('erfolgreich speichern!'); }); Webrequest Die WebRequest -Serie von APIs kann verwendet werden, um //Manifest.json { // Berechtigungsantrag "Berechtigungen": [ "WebRequest", // Webanforderung "WebRequestBlocking", // blockieren Webanforderung "Speicher", // Plugin Local Storage "http: //*/*", // Website zugänglich über executescript oder insertCSS "https: //*/*// Website zugänglich über executescript oder insertCSS". } // Hintergrund.js // ob das Bild var ausshowage angezeigt werden soll; chrome.storage.sync.get ({showimage: true}, function (items) { showimage = items.showimage; }); // Die Überwachung der Webanforderung gibt den letzten Parameter den Blockierungsmodus an, und eine separate Berechtigung muss deklariert werden: WebRequestBlocking chrome.webrequest.onbeForeRequest.AddListener (Details => { // Abbrechen bedeutet, diese Anfrage abbrechen if (! showimage && details.type == 'image') return {abbrechen: true}; // Einfache Audio- und Videoerkennung // Die meisten Websites verwenden Medien nicht als Videotyp, und das Video ist vor dem Herunterladen geschützt. Dies gilt daher nur zu Demonstrationszwecken und hat keine praktische Bedeutung, wenn (details.type == 'medien') { chrome.notifications.create (null, {{ Typ: 'grundlegend', iconurl: 'img/icon.png', Titel: 'Audio und Video erkannt', Nachricht: 'Audio- und Videoadresse:' + details.Url, }); } }, {urls: ["<all_urls>"]}, ["Blocking"]); Internationalisierung Erstellen Sie einen Ordner mit dem Namen { "Plugindesc": {"Nachricht": "Eine einfache Chrome -Erweiterungs -Demo"}, "HelloWorld": {"Nachricht": "Hallo Welt!"} } { "Plugindesc": {"Nachricht": "Eine einfache Chrom -Plugin -Demo"}, "HelloWorld": {"Nachricht": "Hallo, Welt!"} } Stellen Sie es in { "Beschreibung": "__msg_plugindesc__", // Standardsprache "default_locale": "zh_cn", } Schalten Sie beim Testen die Sprache, indem Sie eine andere Verknüpfung für Chrome erstellen Englischer Effekt: Chinesischer Effekt: API -ZusammenfassungEinige häufig verwendete API -Serien:
Gelernte LektionenZeigen Sie den installierten Plugin -Pfad an Der Quellcode-Pfad der installierten Plug-Ins lautet: Wie kann man die ID eines Plugins betrachten? Gehen Sie zu Chrome: // Erweiterungen und überprüfen Sie das Kontrollkästchen für den Entwicklermodus. Achten Sie besonders auf HintergrundfehlerOft stellen Sie fest, dass Ihr Code unerklärlich ausfällt und den Grund nicht finden kann, wie sehr Sie sich bemühen. So verhindern Sie, dass die Popup -Seite schließtBei der Überprüfung von Elementen auf einer Popup -Seite wird das Popup gezwungen und kann nicht geschlossen werden. Dieser Ansatz ist in einigen Fällen nützlich! Unterstützt die Inline -JavaScript -Ausführung nichtDas heißt, es unterstützt nicht das Schreiben von JS direkt in HTML, zum Beispiel: <input id = "btn" type = "button" value = "sammeln" onclick = "test ()"/> Der Fehler lautet wie folgt:
Die Lösung besteht darin, JS zu verwenden, um Ereignisse zu binden: $ ('#btn'). on ('click', function () {alert ('test')}); Darüber hinaus schreiben Sie für das A-Tag Wenn Sie schreiben: <a href = "JavaScript:;" Der Fehler lautet wie folgt:
Seien Sie vorsichtig, wenn Sie CSS injizieren Da die durch Der Grund, warum ich dies betone, ist, dass die Probleme, die es mit sich bringt, sehr versteckt und nicht leicht zu finden sind. Dann haben Sie lange hart gesucht und herausgefunden, dass es tatsächlich von einem Stil im Plug-In betroffen war! Verpackung und VeröffentlichungWenn Sie sich packen möchten, befindet sich auf der Plugin -Verwaltungsseite direkt eine Paketschaltfläche: Dann wird eine sieheOffizielle InformationenEs wird empfohlen, die offiziellen Dokumente zu überprüfen. Chrome Plugin Offizielle Dokumentation Homepage Offizielles Beispiel für Chrom -Plugin Manifestdatei Berechtigungen Detaillierte Erläuterung der Syntax von Fuzzy -Matching -Regeln im Dokument von Chrome.xxx.api Informationen von DrittanbieternEinige chinesische Materialien, nicht besonders empfohlen: 360 Dokumentation für sichere Browserentwicklung 360 -Speed -Browser Chrome -Erweiterungsentwicklungsdokumentation Chrome Extension Development Geek Series Blog Beigefügte FotosAngehängliches Bild: Chrom Hochdefinition PNG Format Logo: Das obige ist der detaillierte Inhalt des Complete Guide to Chrome Plug-in (Erweiterung). Das könnte Sie auch interessieren:
|
<<: Kopieren Sie den Inhalt einer Datei an das Ende einer anderen Datei in Linux
>>: Detaillierte Schritte zur Installation von MySQL auf CentOS 7
beschreiben: Installieren Sie die VM unter Window...
Weitere spannende Inhalte finden Sie unter https:...
Inhaltsverzeichnis Komplexe Abfrage und schrittwe...
Die Master-Slave-Synchronisierung, auch Master-Sl...
In diesem Artikel wird ein Nachrichtenfeld mit Sp...
1. Die Bedeutung des Aufbaus eines Nexus-Dienstes...
Der Blogger hat MySQL ein oder zwei Monate lang n...
1. Einleitung Nach dem Start von MySQL wird Buffe...
Inhaltsverzeichnis 1. Vorteile von Proxy gegenübe...
1. Vue – Das erste Vue-CLI-Programm Die Entwicklu...
Dieser Artikel beschreibt die MySQL-Transaktionsv...
Die Tabelle sieht wie folgt aus: HTML-Quellcode E...
Inhaltsverzeichnis 1.1. MySQL-Binlog aktivieren 1...
Um das zuletzt erwähnte Problem zu lösen, habe ic...
1. Einleitung MySQL-Sperren können je nach Umfang...