2009-07-06 6 views
2

J'ai un simple script greasemonkey qui fait une simple manipulation dom. Le script greasemonkey est chargé après le chargement du DOM, c'est bon, alors ça marche et ça marche pour la page initiale. Mais sur ce site (c'est twitter ;-)) des parties de la page sont chargées après un clic par xmlhttprequest et cette partie n'a pas été manipulée par mon greasemonkeyscript.Comment charger un script greasemonkey après AJAX-Request

Existe-t-il une possibilité simple de réexécuter le script après le chargement de xmlhttprequest ou après le changement de DOM par la requête?

Répondre

1

Merci Howard. C'était le chemin dans la bonne direction.

Il est assez difficile de trouver le bon point d'entrée pour détourner une fonction sur un script minifié. Mais j'ai trouvé qu'il y a un truc dans le script twitter. Il appelle window.onPageChange après la requête Ajax. (Je me demande si c'est une bonne pratique courante en javascript et si d'autres le font aussi bien?) J'ai trouvé du code sur http://userscripts.org/scripts/review/47998 qui utilise cette possibilité pour attacher des événements.

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

Une technique puissante lors de l'utilisation de Greasemonkey consiste à «détourner» les fonctions JavaScript existantes. Si la page que vous modifiez a une fonction appelée processAjaxResponse qui est appelée quand pour traiter la réponse XmlHttpRequest, l'on peut faire ce qui suit dans votre script Greasemonkey:

var originalProcessAjaxResponse; 

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

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

Cela vous permet d'injecter vos propres fonctionnalités lorsque l'AJAX événement de réponse se produit.

Questions connexes