Frage

Ich bin sehr nah dran, meine Chrome -Erweiterung perfekt zum Laufen zu bringen, bin aber jetzt in eine letzte Ausgabe.

Das Problem scheint mit dem Inhaltskript in Verbindung zu stehen, das wiederholt auf Websites wie Facebook eingespeisen wird, wobei die gesamte Seite beim Klicken auf einen Link nicht neu geladen wird usw.

Ich denke, das Problem hängt damit zusammen, dass die Website sehr ajax-abhängig ist.

Wenn ich die gesamte Seite aktualisiere oder zum ersten Mal lade, gibt es kein Problem. Meine Erweiterung wird ausgeführt und das Inhaltskript wird ordnungsgemäß injiziert.

Wenn ich die Seite jedoch in der Anfangszeit lade, klicken Sie auf einen Link auf der Website, in dem "Inhaltsabschnitt" von Facebook wird der von Ihnen geklickte Link geladen, während die schwimmende blaue Navigationsleiste oben nicht aktualisiert oder ändert überhaupt.

Dh die gesamte Seite lädt nicht neu. Da sowohl der "Inhaltsabschnitt" der Site als auch die Navigationsleiste im selben Frame sind, wird das Inhaltskript für jeden Link, auf den Sie klicken, immer wieder injiziert.

Ich sehe also in meinem Konsolenprotokoll, dass es 2x, 3x, 4x, 5x usw. ausgeführt wird. Wenn ich auf weitere Links herumklicke, steigt die Zahl jedes Mal um 1.

Meine Frage ist also:

Gibt es eine einfache Möglichkeit, zu überprüfen, ob das Inhaltskript bereits vorhanden/aktiv ist, bevor Sie es erneut injizieren? Oder was kann sonst noch als Arbeit für eine Situation wie diese verwendet werden?

War es hilfreich?

Lösung

Ich habe ein ähnliches Problem vorhergesagt, als ich das Inhaltskript für meine Erweiterung schreibe <body> Element jeder Seite mit dem Erweiterungsnamen und der Version.

Als erstes prüft das Inhaltskript, ob dieses Attribut bereits Skripte und stoppt, wenn dies der Fall ist. Andernfalls fügt es dieses Attribut hinzu (mit einem Wert von true) und fahren mit seinem Zweck fort.

Wenn du meine sehen willst Lösung;

Der etwas kompliziertere Aspekt dieser Technik ist das Abrufen der Version mit Verwendung Nachrichtenübergang und das Manifest (in einer Ajax -Anfrage abgerufen) in ein JSON -Objekt analysieren.

Um genau zu sehen, wie ich diesen Blick auf den erreicht habe init und onRequestHelper Funktionen hier;

Natürlich könnten Sie die Version nur harten oder vollständig auslassen. Solange der Attributname eindeutig ist.

Andere Tipps

Können Sie im übergeordneten Rahmen hinzufügen window.doneInjecting = true; oder etwas ähnliches? (Oder fügen Sie der Seite ein verstecktes Element hinzu - ich bin mir nicht sicher, ob Kinderrahmen auf die JavaScript -Variablen ihrer Eltern zugreifen können.)

Aber im Grunde genommen ein einfaches Flag einstellen, so dass jedes Mal, wenn Ihr Inhaltskript injiziert wird, überprüft, ob das Flag existiert, und weiterhin weitermachen, wenn dies nicht der Fall ist?

Einen Brände jedes Mal, wenn sich der Status eines Registerkartens ändert. Laden Sie einfach Ihre Inhaltskripte unter changeInfo.status == "complete"

Hintergrund.js

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.getSelected(null, function(tab) {
    // Do some stuff
    if (changeInfo.status == "complete")
    {
        // load your scripts here
        chrome.tabs.executeScript(tabId, {file: "jquery.js"});
        chrome.tabs.executeScript(tabId, {file: "jquery.highlight.js"});
    }
});
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top