2016-11-05 2 views
3

werden wir ein Content-Skript, das in der manifest.json Datei initialisiert wird, wie folgt:Inhalt Skripte Derzeit mehrmals in Chrome Extension ausgeführt

"content_scripts": [ 
    { 
    "matches": [ 
     "https://docs.google.com/*" 
     ], 
    "js ["content.js"], 
    "run_at": "document_start", 
    "all_frames": true, 
    "match_about_blank": true  
    } 

], 

, die jedes Mal lädt der Benutzer bis laufen eingestellt ist ein Google Docs-Dokument. Wenn man sich jedoch die Konsolenprotokolle anschaut, scheint es, als ob das Inhaltsskript geladen wurde (ist das korrekte Wort injiziert?) In die neue Registerkarte mehrfach, da wir mehrere Konsolenprotokolle erhalten.

Ich habe in einigen anderen Antworten gelesen, dass dies mit der Tatsache zu tun haben kann, dass das Inhaltsskript einmal geladen wird, wenn die Google Docs-Registerkarte geladen wird, und einmal, wenn es fertig geladen ist. Wie verhindere ich das?

Antwort

5

Das Problem ist "all_frames": true. Google Text & Tabellen betten viele iframe s aus der gleichen Domäne:

<iframe src="https://docs.google.com/document/u/0/preload" style="display:none;" tabindex="-1"></iframe> 
<iframe src="https://docs.google.com/offline/iframeapi?ouid=REDACTED#cd=1" style="display: none;"></iframe> 

Ihr Content-Skript wird immer in all diesen Rahmen injiziert.

Wenn Sie "all_frames": false festlegen: Ihr Inhalt wird nur in den oberen Frame eingefügt und protokolliert nur einmal beim Durchsuchen eines Dokuments in Google Docs.

+0

Ok danke dafür! Was wäre, wenn wir versuchen würden, die Verwendung von Google-Dokumenten durch den Nutzer zu überwachen, und dass unser Inhaltsskript in alle Iframes eingefügt werden müsste, aber wir wollen nicht, dass unser Inhaltsskript mehrmals ausgeführt wird? Ist das möglich? –

+1

Diese scheinen grundsätzlich entgegengesetzte Ziele. Sie haben eine Einschränkung, dass Sie das Inhaltsskript in alle Frames einfügen müssen. Dies bedeutet, dass es in allen von ihnen laufen wird; das ist unvermeidlich. Es klingt wie das, was du versuchst zu tun: "verwende Informationen aus einer Vielzahl von Frames, führe ein Skript genau einmal aus und mutiere dann (einige von?) Diese Frames". Dazu benötigen Sie einen Weg, wie die Inhaltsskripte zueinander orchestrieren und miteinander kommunizieren können. Sie benötigen einen gemeinsamen Status. Sie können hierfür ein "Hintergrundskript" verwenden; Inhaltsskripts können Nachrichten senden und Nachrichten zurücksenden. – Birchlabs

+0

keine Notwendigkeit für Inhaltsskript. Siehe Tabs api –