2010-05-20 8 views
2

J'essaye d'écrire un script Greasemonkey pour Facebook et j'ai des problèmes avec le chargement génial de page/contenu qu'ils font (je ne comprends pas tout à fait - beaucoup des liens sont en fait juste en train de changer le GET, mais je pense qu'ils font une sorte de redirection de serveur pour que l'URL ressemble au navigateur aussi?). Essentiellement, le seul test requis est de mettre un GM_log() seul dans le script. Si vous cliquez sur Facebook, même avec facebook.com/* comme modèle, il n'est souvent pas exécuté. Y a-t-il quelque chose que je puisse faire, ou est-ce que l'idée d'un "chargement de page" est corrigée dans Greasemonkey, et FB "l'empêche" de fonctionner en utilisant une seule URL?Le script Greasemonkey n'est pas exécuté lorsque le chargement de contenu inhabituel est utilisé

Si j'essaie de faire un peu de manipulation de contenu de base comme ceci:

GM.log("starting"); 
    var GM_FB=new Object; 
    GM_FB.birthdays = document.evaluate("//div[@class='UIUpcoming_Item']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); 
    for (i = GM_FB.birthdays.snapshotLength - 1; i >= 0; i--) { 
     if (GM_FB.birthdayRegex.test(GM_FB.birthdays.snapshotItem(i).innerHTML)) { 
      GM_FB.birthdays.snapshotItem(i).setAttribute('style','font-weight: bold; background: #fffe88'); 
     } 
    } 

Le résultat est que, parfois, seule une actualisation de page de manuel faire fonctionner. Tirer sur la console Firebug et forcer le code à fonctionner fonctionne bien. Notez que ceci n'est pas dû au chargement tardif de certaines parties du DOM: j'ai ajouté du code plus tard pour attendre les éléments pertinents et, le plus important étant que le message ne soit jamais enregistré pour certaines transitions. Par exemple, lorsque je passe de Messages à Fil de nouvelles et de retour.

Répondre

3

Ne sont-ils pas utilisant ajax pour charger le contenu? Vous pouvez trouver l'élément en cours de mise à jour en utilisant Firebug par exemple. Lorsque vous cliquez sur quelque chose et l'URL change, mais avec un # sur l'URL et après ce texte, cela signifie que le texte n'est pas un chemin, c'est un paramètre, le navigateur ne changera pas la page que vous êtes, ainsi, depuis que GreaseMonkey injecte le script sur la page load, il ne s'injecte plus, car la page ne recharge pas. Comme dans votre exemple l'URL facebook.com/#!/sk=messages ne navigue pas loin de facebook.com/ il ne déclenchera pas l'événement window.load. Donc, vous devez trouver quel élément est en cours de modification et ajouter un écouteur d'événement à cet élément, vous pouvez faire est d'utiliser Firebug comme je l'ai mentionné auparavant. Une fois que vous avez déterminé quel élément obtient le contenu, vous devez ajouter un écouteur d'événement à cet élément et non à la page (GreaseMonkey ne s'applique qu'à l'événement de chargement de la fenêtre).

Donc, vous scriptez GM que vous auriez (« code air »)

document.getElement('dynamic_div').addEvent('load', /*your script*/); 
+0

La plupart des choses que j'ai vérifié regardé comme des liens normaux, mais ils ajouter des choses aux paramètres GET URL plutôt que le changement (il reste toujours comme facebook.com/?blahfoo). Pour une raison quelconque, je ne semble pas obtenir une autre exécution de GM quand cela arrive. –

+0

A-t-il un '#' sur l'URL? L'URL de la page peut changer mais ne rechargera pas la page. Il n'y a pas d'autre moyen de le faire en exécutant des scripts à partir d'un site Web. – BrunoLM

+0

Une redirection côté serveur empêcherait-elle GM de s'exécuter dans ce cas? par exemple. charger FB frais, Messages href est facebook.com/?sk=messages mais quand vous cliquez sur il va à facebook.com/#!/sk=messages et GM ne fonctionne pas. Cela expliquerait une partie du problème. Bien sûr, c'est aussi jouer avec mon setTimeout (et je ne fais pas le nom de la fonction comme erreur de chaîne) pour vérifier l'arrivée des éléments. Bit d'un site difficile à écrire. –