2

Das ist mein erster Hack beim Schreiben einer Chrome-Erweiterung. Ich möchte, dass jedes Mal, wenn eine Facebook-Seite geladen wird, ein ziemlich einfaches JavaScript ausgeführt wird. Es macht alles, was ich will außer, dass aus irgendeinem Grund, führt es nur mein Skript, wenn ich die Schaltfläche Aktualisieren drücken. Wenn z.B. Ich habe auf das Facebook-Logo geklickt, oder ich gehe zu einem Status aus meinen Benachrichtigungen, das Skript läuft nicht ... bis ich auf Aktualisieren klicke.Chrome Extension, die auf allen Facebook-Seiten laufen soll, wird nur ausgeführt, wenn ich auf Refresh klicke

Hier ist mein Manifest:

{ 
    "name": "Anti-social Reader", 
    "version": "1.0", 
    "description": "Defeats 'social reader' apps on Facebook, by letting you just see the news story directly without installing the app.", 
    "content_scripts": [ 
     { 
      "matches": ["http://*.facebook.com/*", "https://*.facebook.com/*"], 
      "js": ["kill_social_reader.js"], 
      "run_at": "document_end", 
      "all_frames": true 
     } 
    ] 
} 

ich es brauche, bis document_end zu warten, weil es das DOM der geladenen Seite geändert wird. Ich bin sicher, es ist etwas Dummes ... irgendwelche Ideen?

+0

Danke für die Antworten. Ich überprüfte mtk's, weil er der erste war, der reagierte :) Es ist nicht so einfach wie ein Listener für das DOM zu ändern, weil mein Skript das DOM selbst ändert ... also vermute ich, dass das schlecht wäre. :) Ich habe Amaans Lösung ausprobiert (ohne es zu verstehen) und es hat nicht richtig für mich funktioniert, aber ich habe wahrscheinlich etwas falsch gemacht - ich habe keine Zeit damit verbracht es zu debuggen. In jedem Fall, ich denke, meine grundlegende Frage wurde beantwortet, jetzt ist es nur eine Frage der Auslösung des richtigen Ereignisses. Danke für die Antworten !! – user435779

+0

Beachten Sie, dass es bei größeren Websites, insbesondere bei Einzelseiten-Apps, häufiger vorkommt, dass kein vollständiger Seiten-Reload durchgeführt wird, sondern ein Statuswechsel stattfindet. Z.B. YouTube, Trello, Twitter. Hier ist eine andere Lösung, die Chrome WebNavigation API und Tabs API verwendet: http://StackOverflow.com/a/21071357/72321 – Dennis

Antwort

1

In einer offensichtlichen Weise ist es nicht möglich. Die Facebook-Seite macht zahlreiche Ajax Anrufe, daher wird die Seite nicht vollständig neu geladen. Was Sie hier brauchen, ist zu identifizieren, ob eine Ajax Anrufantwort vom Browser empfangen wurde oder nicht? und dann das erforderliche Ereignis auszulösen. Ich kann diesen Teil nicht kommentieren, da ich in dieser Hinsicht immer noch ein Neuling bin.

1

Ich denke, Sie haben Ihren Code innerhalb $(function() {}) geschrieben, die offensichtlich eine Seitenladung erfordern. Aber Sie wollen Ihren Code auszuführen, wenn die Seite DOM ändert, dann kann dies helfen:

document.addEventListener('DOMNodeInserted', function (event) { 

}); 

Weitere Informationen: http://reminiscential.wordpress.com/2011/10/04/building_google_reader_plugin/

+4

** Für den Rekord: Diese Antwort ist mittlerweile veraltet. ** Siehe [DOM MutationObserver] (https://developer.mozilla.org/en/docs/Web/API/MutationObserver) für eine moderne Alternative. Es wäre großartig, wenn der Autor die Antwort aktualisiert hätte. – Xan

2

Wie mtk sagte, ist es, weil Facebook nutzt AJAX-Aufrufe, wenn Sie auf dem Home-Button klicken oder Wasauchimmer. Um Ihren Code jedes Mal auszuführen, wenn ein AJAX-Anruf getätigt wird, können Sie XMLHttpRequest übernehmen. Sie könnten so etwas zu Ihrem Inhaltsskript hinzufügen, sodass bei jedem Öffnen einer AJAX-Anfrage Ihr Code aufgerufen wird. Sie können einen Ereignis-Listener hinzufügen, der darauf wartet, dass die AJAX-Anforderung abgeschlossen wird, bevor Sie Ihren Code ausführen.

(function(open) { 
    XMLHttpRequest.prototype.open = function() { 
    // add the function you want to run here 
    open.apply(null, arguments); 
    }; 
})(XMLHttpRequest.prototype.open); 
+0

Korrektur: Damit dies funktioniert, muss dies als [Skript auf Seitenebene] ausgeführt werden (http://stackoverflow.com/questions/9515704/building-a-chrome-extension-inject-code-in-a- page-using-a-content-script), und selbst dann ist es etwas schwierig (es wird vom Rest des Erweiterungscodes isoliert) – Xan