2010-06-20 19 views
2

J'ai créé un script utilisateur pour Facebook et regroupe les notifications similaires. Maintenant, en utilisant juste une page HTML statique avec les anciennes notifications que j'avais, le script fonctionne à 100%.Exécuter le code une fois la fonction terminée OU DIV apparaît

Voici le problème: le DIV qui contient des notifications par défaut, n'a aucune notification jusqu'à ce que l'utilisateur clique sur le bouton Notification. Facebook a un événement en ligne onclick qui affiche le DIV (menu Notifications) et utilise AJAX pour récupérer les notifications. Comme mon script ne s'exécute qu'au démarrage, il n'y trouve rien - il n'a aucun effet sur la page. J'ai essayé d'utiliser un événement .click() mais juste lorsque vous cliquez sur le bouton Notifications, il exécute mon code. Le fait est que Facebook exécute toujours sa requête AJAX pour les notifications, ce qui signifie qu'il n'y a toujours pas de notifications pour que mon script fonctionne, ce qui fait qu'il n'a aucun effet.

Je ne veux pas utiliser un setTimeout générique car je ne veux pas que l'utilisateur ait à voir les notifications avant de les voir soudainement après. Existe-t-il un moyen de surveiller le DIV une fois que les notifications sont ajoutées, il fonctionne? Ou qu'une fois que Facebook aura terminé sa requête AJAX, il exécutera mon code?

+0

Je n'ai pas regardé le code moi-même, donc je ne suis pas prêt à soumettre une réponse, mais je vous conseillerais de voir si l'objet XML HTTP Request (AJAX) apparaît et de surcharger le .onreadystatechange fonction de rappel. De toute évidence, vous devez conserver la fonctionnalité existante via 'xmlobj.onreadystatechange = function() {onreadystatechange(); your_new_functionality();} Évidemment, ce sera infiniment plus difficile parce que le code de Facebook sera probablement obscurci/compressé, mais une certaine graisse de coude de débogage de js devrait être capable d'amadouer l'objet xml. –

+1

@Steven - qui lierait étroitement la solution avec la mise en œuvre actuelle de Facebook. Tout changement de leur côté aura un impact sur l'application. 'setInterval' semble être une approche plus saine, jusqu'à ce que [DOM Mutation events] (http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events -eventgroupings-mutationevents) deviennent monnaie courante. Aussi, voir http://stackoverflow.com/questions/1091661/detect-div-content-changes-with-jquery – Anurag

Répondre

1

Vous pouvez setInterval() pour surveiller le innerHTML de div, une fois rempli, vous pouvez exécuter.

+0

Par souci de performance, je suis sur le point de mettre un setInterval qui commence par un clic sur le bouton Notifications et effectue une vérification tous les .5sec. Comment et quand puis-je y mettre fin? – NessDan

+0

Vous pouvez utiliser 'clearInterval()'. – Babiker

+0

Merci, j'ai fini par utiliser un setInterval() et appelé tous les JS pour modifier les notifications (j'ai également utilisé CSS pour cacher les notifications par défaut.) Tout s'est avéré meilleur que prévu :) – NessDan

-1

Peut-être que vous pouvez ajouter une boucle setTimeout. Quelque chose comme

setTimeout(function(){ 
/* check for divs */ 

if(/* divs are found */){ 
//apply code 
} 
else { 
setTimeout(/* loop again */); 
} 

},1000); 
+0

Je vois ce que vous voulez dire, mais si, pour une raison ou une autre, Facebook s'arrête, alors je pourrais manquer le point. Si Facebook se charge assez rapidement, je ne veux pas que mon script ait à descendre l'utilisateur et à le faire patienter.Merci quand même! – NessDan

0

Voici le problème: la DIV qui détient des notifications par défaut, n'a pas notifications jusqu'à ce que l'utilisateur clique sur le bouton de notification. Facebook a un événement onclick en ligne qui affiche le DIV (menu Notifications) et utilise AJAX pour récupérer les notifications.

...

Je ne veux pas utiliser un setTimeout générique parce que je ne veux pas que l'utilisateur ait à voir les notifications avant et puis les voir tout à coup après. Existe-t-il un moyen de surveiller le DIV une fois que les notifications sont ajoutées, il fonctionne?

Oui il y a:

var notificationDiv = document.getElementById(...); 
var lastTimeoutID = null; 
var main = function(evt){ 
    // evt.target is the inserted element 
    // if you expect more elements, then do the following: 
    lastTimeoutID = setTimeout(function(){ 
    lastTimeoutID = null; 
    // uncomment below block if you only need to do the work once. 
    /* 
    notificationDiv.removeEventListener("DOMNodeInserted", main, false); 
    */ 

    // do your work here. 
    }, 500); // waiting 500ms for next element to be added, otherwise doing work. 
    if (lastTimeoutID) { 
    clearTimeout(lastTimeoutID); 
    lastTimeoutID = null; 
    } 
}; 
notificationDiv.addEventListener("DOMNodeInserted", main, false); 

Tout le code de délai ci-dessus peut être amovible en fonction de ce que vous êtes en train de faire est userscript.