2010-10-22 4 views
0

J'ai un div dont le contenu change constamment en fonction d'un processus côté serveur. Actuellement, j'utilise jQuery load pour interroger le serveur toutes les 3 secondes pour obtenir les mises à jour.jQuery: assistance à la mise à jour du contenu div onchange

C'est ce que j'ai:

function poll() { 
    reloadPage(); 
    setTimeout("poll();", 3000); 
} 

function reloadPage() { 
     $("#mydiv").load(location.href + " #mydiv>*", ""); 
} 

Cela fonctionne bien dans Firefox, mais dans IE, la charge ne met pas à jour la div, probablement en raison d'un problème de mise en cache. Y a-t-il une meilleure façon de faire ce que j'essaie de faire autrement que d'interroger périodiquement?

+0

qu'est-ce que 'location.href +" #mydiv> * "' supposé être? – Tomalak

+0

Il fait un rafraîchissement partiel sur seulement ce div – Prabhu

+0

@Tomalak vérifier les docs à http://api.jquery.com/load/, je devais le rechercher moi-même – Znarkus

Répondre

4

Vous devez modifier l'URL de chaque demande pour empêcher IE de mettre en cache la réponse.

Par exemple:

function poll() { 
    reloadPage(); 
    setTimeout(poll, 3000); 
} 

function reloadPage() { 
    $("#mydiv").load(location.href + "?Timestamp=" + new Date() + " #mydiv>*", ""); 
} 

En outre, vous ne devriez pas passer une chaîne à setTimeout.

+0

Super, merci beaucoup, cela l'a fait ... – Prabhu

+0

jQuery ne cache pas les réponses sans en-têtes pour la mise en cache? Juste curieux, par exemple. PHP n'envoie pas ces en-têtes par défaut – Znarkus

+0

@Znarkus: Ceci est un problème d'IE; IE a une mise en cache très agressive. – SLaks

2

L'ajax de jQuery a un tas de paramètres par défaut, dont l'un contrôle la mise en cache. Si vous le définissez sur false, il ajoutera un horodatage à l'appel ajax pour empêcher la mise en cache.

http://api.jquery.com/jQuery.ajax/

+0

+1 pour suggérer $ .ajax. Je n'utilise jamais les raccourcis, c'est plus facile à retenir. – Znarkus

0

Y at-il une meilleure façon de faire ce que je suis en train de faire autre que l'interrogation périodique?

Puisque HTTP est un protocole sans état, non. Vous devez interroger pour voir ce qui se passe sur le serveur.

Mais il y a une meilleure façon de mettre en œuvre le vote:

setInterval(function() { 
    $("#mydiv").load(location.href + " #mydiv>*", {Timestamp: new Date()}); 
}, 3000); 

Notes:

  • définir un intervalle au lieu du délai d'attente,
  • passer une fonction réelle à setInterval, pas chaîne
  • utilisez le paramètre data de load() pour passer dans un disjoncteur de cache
+0

SetInterval lancera-t-il le premier appel après 3 secondes ou démarrera-t-il instantanément? J'avais besoin que le premier se produise instantanément. – Prabhu

+0

@Prabhu: Mais le "premier chargement" est le chargement de la page du navigateur lui-même. Ensuite, les charges arrivent très trois secondes. Il n'est pas nécessaire d'actualiser la page juste après le chargement. – Tomalak

+0

cool, a du sens – Prabhu

Questions connexes