2009-07-06 9 views
2

Ich habe ein simples Grainemonkey-Skript, das einige einfache dom-Manipulationen macht. Das Skript wird nach dem Laden des DOM geladen, das ist in Ordnung und funktioniert auch für die erste Seite. Aber auf dieser Seite (es ist Twitter ;-)) werden Teile der Seite nach einem Klick von xmlhttprequest geladen und dieser Teil wurde nicht von meinem greasemonkeyscript manipuliert.Wie lade ich ein Grainemonkey-Skript nach AJAX-Request?

Gibt es eine einfache Möglichkeit, das Skript erneut auszuführen, nachdem die xmlhttprequest geladen wurde oder nachdem das DOM von der Anfrage geändert wurde?

Antwort

1

Danke Howard. Es war der Weg in die richtige Richtung.

Es ist ziemlich schwierig, den richtigen Einstiegspunkt zu finden, um eine Funktion in einem minifyierten Skript zu übernehmen. Aber ich habe festgestellt, dass es im Twitter-Skript einen Haken gibt. Es ruft window.onPageChange nach der Ajax-Anforderung auf. (Ich frage mich, ob dies eine gängige Praxis in Javascript ist und wenn andere dies auch tun?) Ich habe einen Code auf http://userscripts.org/scripts/review/47998 gefunden, der diese Möglichkeit nutzt, um Ereignisse anzuhängen.

 if (typeof unsafeWindow.onPageChange === 'function') { 
     var _onPageChange = unsafeWindow.onPageChange; 
     unsafeWindow.onPageChange = function(){ 
      _onPageChange(); 
      filter(); 
     }; 
    } else { 
     unsafeWindow.onPageChange = filter; 
    } 
3

Eine leistungsstarke Technik bei der Verwendung von Greasemonkey besteht darin, vorhandene JavaScript-Funktionen zu "kapern". Wenn die Seite, die Sie ändern sind eine Funktion hat processAjaxResponse genannt, die aufgerufen wird, wenn die XmlHttpRequest Antwort zu verarbeiten, kann der Sie Folgendes tun in Ihrem Greasemonkey-Skript:

var originalProcessAjaxResponse; 

function myNewProcessAjaxResponse() { 
    /* Manipulate DOM if you need to, and then... */ 
    originalProcessAjaxResponse(); 
} 

function hijack() { 
    var originalProcessAjaxResponse = processAjaxResponse; 
    processAjaxResponse = myNewProcessAjaxResponse(); 
} 

So können Sie Ihre eigene Funktionalität, wenn die AJAX injizieren Reaktionsereignis tritt auf.