2010-02-22 9 views
2

Voici la configuration en bref. J'ai une grande table. Chaque fois qu'une cellule se concentre un appel asyncron au serveur est fait (avec PageMethods) et certaines données sont retournées et met à jour une infobox dans la page. J'ai écrit un code qui permet de naviguer entre les cellules avec les touches fléchées. Le problème se produit lorsque je déplace le focus rapidement à travers plusieurs cellules afin d'atteindre la cellule que je veux. Chaque get-focus est exécuté et comme la communication avec le serveur prend environ une demi-seconde, cela devient très irritant et pas très convivial. Idéalement, je voudrais exécuter uniquement le dernier événement de mise au point. Mais comment? Je ne peux pas savoir quel événement est le dernier, je peux? Des idées, quelqu'un?Exécuter uniquement la dernière fonction appelée

+0

@Magnus - J'ai repensé votre question afin que plus de gens aient une chance de la trouver. – Paolo

+0

par cellules voulez-vous dire que vous avez des zones de texte ??? –

Répondre

1

En principe, vous avez besoin d'une minuterie de courte durée qui commence à être décomptée lorsqu'un événement de mise au point est déclenché. Si un autre événement se produit avant l'expiration du temporisateur, vous le redémarrez, sinon vous exécutez la logique OnFocus pour la dernière cellule.

L'astuce consiste à faire en sorte qu'il soit suffisamment court pour que l'interface utilisateur reste sensible, mais assez longtemps pour éviter de déclencher plusieurs appels au serveur. Malheureusement pour vous, je ne sais pas comment vous le feriez pour ASP.NET, mais je l'ai fait dans Winforms pour des situations similaires.

2

Paolo est juste sur.

Pour ce faire sur le web vous combiner votre événement de mise au point en cours avec le javascript timing functions setTimeout et clearTimeout:

var timer; // timer variable in scope for other functions 

var onFocus = function() { 
    clearTimeout(timer); 
    timer = setTimeout("makePageMethodCall()", 500); 
} 

var makePageMethodCall = function() { 
    // make ajax call to your PageMethod function 
} 

L'appel à setTimeout() crée une demi-seconde le temps d'attente avant d'appeler la méthode qui faire l'appel à votre serveur. Si un autre événement de mise au point se produit avant l'expiration de ce temporisateur, l'appel clearTimeout() annulera le temporisateur en cours avant qu'un autre soit démarré. Comme le recommande Paolo, vous pouvez expérimenter avec la durée de 500 ms pour trouver la valeur qui convient le mieux à votre situation.

Questions connexes