Deux scripts ajax sur le même form <=> 2 instances xhr

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Deux scripts ajax sur le même form <=> 2 instances xhr

par didgar » 01 août 2006, 11:13

Re !

Il y un pb !

Je lance la verif sur le champ pseudo avec un onblur(). Si je me rends sur un champ quelconque du form tout va bien. La vérif se fait correctement.

Par contre, une partie du process qui concerne le code postal est lancée sur un onfocus(). Si je renseigne le champ pseudo et que je clique dans le champ code postal, la verif du pseudo ne se fait pas du tout. Elle est courcircuitée.

Pour la relancer, je dois recliquer dans le champ pseudo et cliquer n'importe ou sauf dans le champ code postal. Il y a bien une sorte de collision.

Je vais donc instancier deux objets "xhr" ce qui m'amène à une autre question :

J'utile ça :

Code : Tout sélectionner

var xhr = null; function getXhr(){ if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } }
Puis j'ai deux fonctions. Une pour la verif pseudo et une pour l'association codepostal => liste des villes

Dans chacune de ces fonctions "utilisateur" il y a l'appel getXhr(); qui insctancie l'objet xhr en utilisant la fonction ci-dessus.

J'aimerais pouvoir remplacer dans mes fonctions utilisateur getXhr(); par getXhr('codepostal'); dans un cas et getXhr('pseudo'); dans l'autre. Ceci afin d'instancier xhr_pseudo et xhr_codepostal avec la même fonction.

Est-ce possible ?

Si oui comment se traduit

Code : Tout sélectionner

function getXhr(){ if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); ... }
Faut-il écrire :

Code : Tout sélectionner

function getXhr(nom){ if(window.XMLHttpRequest) // Firefox et autres xhr_eval(nom) = new XMLHttpRequest(); ... }
En fait je ne sais pas trop comment générer le nom de l'objet à la volée :oops: Je ne sais plus s'il faut utiliser eval ou autre :roll:

D'autant que dans mes fonctions "utilisateur" la syntaxe sera en dur :

Code : Tout sélectionner

leselect = xhr.responseText;
deviendrait

Code : Tout sélectionner

leselect = xhr_codepostal.responseText;
J'espère que ma question est claire :-k

A+

Didier

par zeus » 01 août 2006, 10:37

Si les fonctions qui instancient ces appels sont distinctes, les instances seront bien séparées dans le code

Si les 2 appels sont dans la même fonction, le 1er retour bloquera le 2nd.

Donc pas de soucis

par didgar » 01 août 2006, 10:27

Salut !

Ok ! Je pense avoir compris mais ( il y a tjs un mais :mrgreen: ) j'aimerais en être bien sur.

Dans une des fonctions j'ai :

Code : Tout sélectionner

lareponse = xhr.responseText;
dans l'autre fonction j'ai :

Code : Tout sélectionner

leselect = xhr.responseText;
Les deux sont exécutés sur la même page. Si on suppose qu'une réponse mette un peu plus de temps que prévu pour revenir du serveur, n'y a-t-il pas de risque de collision comme tu dis dans le cas ou le second script ait été sollicité ? Et la tu te retrouves avec un menu déroulant à la place d'un paragraphe de texte ou l'on te dit que le pseudo que tu as choisi existe déjà :-*

C'est pour cette raison que je me demande s'il ne serait pas judicieux d'instancier deux objets "xhr" différents ??

A+

Didier

par zeus » 01 août 2006, 09:48

Le code que tu nous montres est la parti JS de ton AJAX. Celà veut dire que ce code s'exécute sur le poste client.

Donc le code ne sera exécuté que par une seule personne à la fois sur un poste => pas de soucis de collision.

par didgar » 01 août 2006, 09:43

Salut !

Personne n'a une petite idée ?

A+

Didier

Deux scripts ajax sur le même form <=> 2 instances xhr

par didgar » 31 juil. 2006, 17:01

Salut !

Sur un formulaire j'ai deux scripts ajax qui sont appelés.

Un script sur la vérification de disponibilité de pseudo et l'autre sur l'association code postal => liste de villes.

Pour faire fonctionner tout ça j'utilise :

Code : Tout sélectionner

var xhr = null; function getXhr(){ if(window.XMLHttpRequest) // Firefox et autres xhr = new XMLHttpRequest(); else if(window.ActiveXObject){ // Internet Explorer try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } } else { // XMLHttpRequest non supporté par le navigateur alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); xhr = false; } }
puis les fonctions qui vont bien.

En local, un seul utilisateur cad moi, tout va bien, ça fonctionne parfaitement. La variable xhr est instanciée une fois et sert aux deux script ajax.

N'étant pas très avancé en ajax, je me demande s'il ne serait pas plus sur d'instancier deux fois ( deux noms différents ) la variable xhr. Genre xhr_pseudo et xhr_codepostal ( plus les modifs qui vont bien dans les foncions ) pour éviter que la réponse de l'un n'aille perturber l'autre une fois en prod avec 50 personnes qui remplissent le form en même temps.

Qu'en pensez-vous ?

A+

Didier