2009-07-20 6 views
3

Wow, celui-ci m'a arraché les cheveux.La fonction de clic JQuery ne se déclenche pas par intermittence

Je suis suivi des liens dans JQuery.

$(".hdr a[id]").mousedown(function(e){ 
    var h = this; 
    var url = "/g/click/" + this.id; 
    $.get(url); 
    }); 

Il semble que parfois le navigateur bat l'appel ajax. La nouvelle page est chargée avant que le suivi des clics ne soit déclenché. (Ce n'est pas un temps de réponse lent, la requête ne touche même pas apache). C'est intermittent et pas facilement reproductible, mais il a tendance à apparaître après que l'utilisateur a fait beaucoup sur le site.

J'ai utilisé preventDefault dans une itération antérieure de ceci, mais cela finit par casser cmd-click et ne suit pas les clics droits.

Y at-il un moyen de s'assurer que cela fonctionnera?

Merci pour votre aide.

+0

Jason, s'il vous plaît méfiez-vous des implications de l'utilisation d'un appel synchronus xhr – redsquare

Répondre

2

Sons comme le même problème que j'avais quand j'ai demandé: $.post() doesn't have time to run? La solution pour moi était d'ajouter ce qui suit dans le mélange:

$.ajaxSetup({async: false}); 

Pas faire plus des requêtes asynchrones signifiaient mes articles terminerait avant que d'autres seraient commencer.

+0

J'ai fini par le faire, et il semble avoir résolu le problème. Merci! –

1

Si vous utilisez une requête get, la réponse sera mise en cache. Pour résoudre le problème de cache, vous devez vous assurer que l'URL est unique. Vous pouvez le faire en ajoutant un élément de chaîne de requête unique à chaque fois à l'URL ou mieux utiliser la méthode .ajax et spécifier le cache: false.

Je n'utiliserais pas l'asynch: false car cela verrouille l'interface utilisateur et si la réponse ne revient pas ou est retardée, l'utilisateur doit finalement se déconnecter et ne pas résoudre le problème en cache.

$(".hdr a[id]").mousedown(function(e){ 
    var url = "/g/click/" + this.id; 
    $.ajax({ 
     url: url, 
     cache: false, 
     success: function(data){ 
       //do something with the response 
       } 
     }); 
}); 

N.B. I peut également être tenté de mettre un appel setTimeout dans votre script. Cela vous permettra d'effacer le timeout si un autre événement mousedown se produit rapidement. Cela empêchera l'envoi d'une avalanche de requêtes xhr si l'utilisateur effectue plusieurs fois la souris.

Questions connexes