Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2095 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [résolu] eviter blocage navigateur lors de recherche de ville

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[résolu] eviter blocage navigateur lors de recherche de ville

n°1961346
Maitre Jed​i
Que la Force soit avec Toi
Posté le 28-01-2010 à 18:00:54  profilanswer
 

salut à tous,
 
j'ai une page web qui permet de faire une recherche de ville soit en passant le code postal, soit en passant le nom.
l'affichage des villes est dans une balise select.
 
le problème, c'est que lors de recherche de ville avec des noms long (ex : saint martin du fion), le navigateur se bloque pendant une seconde ou deux, donc par exemple,
si j'écris dans ma zone de texte "sain", il me renvoit toutes les villes commençant par ces lettres mais je suis obligé d'attendre avant de pouvoir écrire le "t", puis l'espace, etc...
plus on se rapproche de la fin du nom, plus c'est rapide...
 
j'avais pensé au xhr(abort), mais ça fait pas comme je veux, ça me bloque quand même...
 
existe t'il une fonction permettant de ne pas bloquer et que je puisse continuer d'écrire le nom de la ville ?
 
Merci


Message édité par Maitre Jedi le 01-02-2010 à 11:22:10
mood
Publicité
Posté le 28-01-2010 à 18:00:54  profilanswer
 

n°1961352
pataluc
Posté le 28-01-2010 à 18:20:48  profilanswer
 

c'est bizarre, le 1er A de AJAX voulant dire "asynchrone", ca devrait pas bloquer ton navigateur... c'est quoi ton code?

n°1961360
Maitre Jed​i
Que la Force soit avec Toi
Posté le 28-01-2010 à 18:38:10  profilanswer
 

voici mon code javascript !!
 
soyez mignon, c'est mon premier  :D  
 
function affichageville(cp)
{
 if(cp != '')
 {
  if (cp.length>2)
  {
   
   
   selville = document.getElementById('ville');
   for (a=0; a<selville.options.length; a++)
   {
    selville.options[a] = null;
    a=0;
   }
   cp=cp+"%";
   if(texte = file('ajaxville.php?cp='+escape(cp)))
   {
     var reg=new RegExp("[;.]+", "g" );
   
     var tableau=texte.split(reg);
   
     selville = document.getElementById('ville');
     var j= 0;
     for (var i=0; i<tableau.length; i++)
     {
      if (tableau[i] != "" )
       {selville.options[j] = new Option(tableau[i+1] + " (" +tableau[i+2]+" )", tableau[i]);}
      i=i+2;
      j=j+1;
     }
     
   }
  }
 }
}

n°1961375
gatsu35
Blablaté par Harko
Posté le 28-01-2010 à 19:46:42  profilanswer
 

la functon file s'il te plait :o
tu fais de l'Ajax en synchrone, alors qu'il faut le faire en asynchrone :


---------------
Blablaté par Harko
n°1961381
Maitre Jed​i
Que la Force soit avec Toi
Posté le 28-01-2010 à 20:33:34  profilanswer
 

merci, de me répondre et désoler d'avoir oublier cette fonction
 
function file(fichier)
{
 if(window.XMLHttpRequest) // FIREFOX
  xhr_object = new XMLHttpRequest();
 else if(window.ActiveXObject) // IE
   xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  else
  return(false);
xhr_object.open("GET", fichier, false);
xhr_object.send(null);
if(xhr_object.readyState == 4)  
 return(xhr_object.responseText);
else return(false);
}
 
j'ai vu que j'étais en mode synchrone, donc je me suis mis en mode asynchrone.
 
par contre la mise à jour du select ne se fait plus...
 
voici le code html tant qu'on y est  
 
<input id="cp" name="cp" type="text" onKeyup="affichageville(this.value)">
<select id="ville" name="ville"></select>


Message édité par Maitre Jedi le 28-01-2010 à 20:41:13
n°1961387
tpierron
Posté le 28-01-2010 à 20:53:37  profilanswer
 

Bah, ouais, parce qu'il faut utiliser le champ onreadystatechange de l'objet XMLHttpRequest pour être notifié de manière ... asynchrone.

n°1961416
Maitre Jed​i
Que la Force soit avec Toi
Posté le 28-01-2010 à 22:52:35  profilanswer
 

Bon, j'ai corrigé ma fonction file
 
function file(fichier)
{
 if(window.XMLHttpRequest) // FIREFOX
  xhr_object = new XMLHttpRequest();
 else if(window.ActiveXObject) // IE
   xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  else
  return(false);
xhr_object.open("GET", fichier, true);
xhr_object.send(null);
xhr_object.onreadystatechange = function()  
 {
  if (xhr_object.readyState == 4 && (xhr_object.status == 200 || xhr_object.status == 0))  
  {
   return(xhr_object.responseText);
  }
  else return(false);
 }
}
 
mais ça marche pas mieux, je suis ultra débutant dedans... C'est sympa de m'aider

n°1961556
tpierron
Posté le 29-01-2010 à 15:10:46  profilanswer
 

Hmm, nan, va falloir revoir la logique de ta fonction affichageville. En fait le traitement sur ton select devra se faire dans ton callback onreadystatechange. En mode asynchrone, lorsque tu appelles "send()", la fonction ne s'arrête pas, ce qui fait que retourner une valeur depuis le callback, ça n'a aucun intérêt.

 

Ah ouais, et mieux vaut assigner le champ onreadystatechange avant d'appeler send().


Message édité par tpierron le 29-01-2010 à 15:11:09
n°1961725
Maitre Jed​i
Que la Force soit avec Toi
Posté le 31-01-2010 à 10:50:28  profilanswer
 

ok, bon j'ai refait mes fonctions, ça fonctionne bien, ça ne bloque plus le navigateur, voici les fonctions :
 
function getXMLHttpRequest()
{
 var xhr = null;
 
 if (window.XMLHttpRequest || window.ActiveXObject)  
 {
  if (window.ActiveXObject)  
  {
   try  
   {
    xhr = new ActiveXObject("Msxml2.XMLHTTP" );
   } catch(e)  
   {
    xhr = new ActiveXObject("Microsoft.XMLHTTP" );
   }
  }  
  else  
  {
   xhr = new XMLHttpRequest();  
  }
 }
 else  
 {
  alert("Votre navigateur ne supporte pas l'objet XMLHTTPRequest..." );
  return null;
 }
 return xhr;
}
 
 
function requete(zipcode)
{
 var xhr_object = getXMLHttpRequest();
 cp = zipcode;
 
 if(cp != '')
 {
  if (cp.length>2)
  {
   cp=cp+"%";
   xhr_object.onreadystatechange = function()  
   {
    if (xhr_object.readyState == 4 && (xhr_object.status == 200 || xhr_object.status == 0))  
    {
     affichageville(xhr_object.responseText);
    }
    else return(false);
   }
   xhr_object.open("GET", 'ajaxville.php?cp='+cp, true);
   xhr_object.send(null);
  }
 }
}
 
 
function affichageville(ville)
{
 selville = document.getElementById('ville');
 for (a=0; a<selville.options.length; a++)
 {
  selville.options[a] = null;
  a=0;
 }
   
 texte = ville;
 var reg=new RegExp("[;.]+", "g" );
 
 var tableau=texte.split(reg);
   
 selville = document.getElementById('ville');
 var j= 0;
 for (var i=0; i<tableau.length; i++)
 {
  if (tableau[i] != "" )
  {
   selville.options[j] = new Option(tableau[i+1] + " (" +tableau[i+2]+" )", tableau[i]);
  }
  i=i+2;
  j=j+1;
 }
}
 
en tout cas, merci pour m'avoir aider à résoudre mon problème...  :jap:  
 
Bon maintenant dans ce code, voyez-vous des choses qui vous choquent, qui ne font pas partie des standards javascript ou autre, ou des fonctions qui pourraient être allégés en termes de codages ??
 
Merci

n°1962058
tpierron
Posté le 01-02-2010 à 16:33:44  profilanswer
 

Maitre Jedi a écrit :


Bon maintenant dans ce code, voyez-vous des choses qui vous choquent, qui ne font pas partie des standards javascript ou autre, ou des fonctions qui pourraient être allégés en termes de codages ??
 
Merci


 
La fonction affichageVille pourrait être légèrement simplifiée en :

Code :
  1. function affichageville(ville)
  2. {
  3.    var selville = document.getElementById('ville')
  4.    var reg      = new RegExp("[;.]+", "g" )
  5.    var tableau  = ville.split(reg)
  6.  
  7.    while (selville.options.length > 0)
  8.        selville.remove(0)
  9.  
  10.    for (var i = 0; i < tableau.length; i += 3)
  11.    {
  12.        if (tableau[i] != "" )
  13.            selville.add(new Option(tableau[i+1] + " (" +tableau[i+2]+" )", tableau[i]), null)
  14.    }
  15. }


mood
Publicité
Posté le 01-02-2010 à 16:33:44  profilanswer
 

n°1962098
Maitre Jed​i
Que la Force soit avec Toi
Posté le 01-02-2010 à 20:28:45  profilanswer
 

Merci à toi


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  [résolu] eviter blocage navigateur lors de recherche de ville

 

Sujets relatifs
résolu: problème curseur[resolu] Remplacer un lien par du texte une fois cliqué
[Résolu] Python 2.6, MySQLdb et Windows, la combinaison perdante ?[RESOLU] Soucis avec mysql_fetch_array dans une fonction
[RESOLU] Question simple sur la DTD[Resolu] Problème de récupération d'un fichier résultat de POST (API)
[résolu] Décalage de qq pixels en haut sous Firefox ?[resolu] top 5 sur inner join
[PHP/HTML/MySql] Outils de dev freeware [Résolu] 
Plus de sujets relatifs à : [résolu] eviter blocage navigateur lors de recherche de ville


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR