2010-02-22 8 views
3

Je suis un débutant en utilisant ajax et j'ai toujours pensé qu'il était complètement asynchrone. Mais j'ai découvert qu'un appel peut être interrompu par un rechargement de page ou un changement de page (comme cliquer sur un lien hypertexte). J'avais l'impression que lorsqu'un appel ajax est lancé, il est effectué peu importe ce que fait le navigateur après. Est-ce faux?Appel interrompu par chargement de la page

Maintenant au problème spécifique que je suis: pensez à un test en ligne où les utilisateurs répondent aux questions (en tapant dans des zones de texte). Quand une zone de texte perd le focus, un appel ajax est déclenché qui conserve la valeur de la zone de texte à une base de données. Cela fonctionne bien en changeant entre les zones de texte. Cependant, j'ai aussi un bouton submit qui déclenche une action post sur une autre page (c'est le bouton submit). Lorsque j'entre quelque chose dans une zone de texte et que je clique sur le bouton après, l'appel n'est pas effectué. En outre, lorsque je tape dans une zone de texte, cliquez ailleurs (également en déclenchant l'appel) et cliquez rapidement sur le bouton d'envoi, l'appel n'est également pas effectué. Est-ce que ce comportement est attendu? La raison pour laquelle j'utilise ajax en premier lieu est de persister les valeurs de sorte que lorsque quelque chose de imprévisible se produit, comme un plantage du navigateur, le texte déjà tapé est déjà sauvegardé.

Ma façon de penser est-elle erronée? Comment allez-vous résoudre ce problème?

Nous vous remercions de votre temps!

+0

Bonne question! –

Répondre

1

Sauf si vous faites quelque chose de spécial avec un stockage local persistant, tous les appels javascript et ajax sont époustouflés lorsqu'une nouvelle page est chargée sur la page en cours. Aussi quand un envoi est fait sur un formulaire.

Pour enregistrer des éléments intra-page, enregistrez les données dès que possible. Par exemple, peut-être économiser sur le clavier, peut-être périodiquement avec une minuterie, pas seulement sur perdre-focus. En soumettant la page: changez le comportement du clic sur le premier enregistrement, puis sur une nouvelle page.

Tous les effets que vous voyez sont normaux.

Aussi, assurez-vous de tester à la fois lent (soit 6 ou 7) et navigateurs rapides (chrome)

2

AJAX est asynchrone.

Lorsque vous envoyez une requête AJAX, le moteur javascript l'envoie et configure un gestionnaire pour la réponse. Toutefois, si vous envoyez une requête AJAX au serveur et que vous quittez la page avant de la recevoir, rien ne se passera. Pourquoi? Parce que chaque page charge l'ensemble de l'environnement Javascript est démonté et réinitialisé, il n'a aucune idée de ce qui s'est passé sur la dernière page.

Pour votre problème, j'intercepter l'action de soumission de formulaire et faire tout ce que vous devez faire avec les données, et puis soumettre le formulaire.

Modifier: En réponse à votre commentaire. Vous avez raison. Si la requête ajax est envoyée et que vous ne dépendez pas de sa valeur de retour, cela ne devrait pas avoir d'importance.

Je vous suggère le débogage de votre problème avec Firebug pour voir si l'appel AJAX est vraiment être envoyé correctement, et pour confirmer votre serveur est en train de traiter correctement, il.

+1

Mais dans cet exemple, je ne me soucie pas de la valeur de retour. Le serveur n'envoie rien de toute façon. Ma compréhension de l'asynchronisme (vrai) est que dès que l'appel est "distribué", il est en route vers le serveur et ne peut plus être interrompu par le navigateur/l'utilisateur. Mais quand je lis votre réponse, il semble que JavaScript retienne d'une certaine manière l'appel afin de pouvoir l'interrompre. Mais pour combien de temps et pourquoi? –