Scriptaculous Ajax.Autocompleter : Mettre en place un champ de saisie avec suggestions dynamiques
Par Pascal MARTIN le dimanche 28 octobre 2007, 12:00 - Développement Web - Lien permanent
Vous avez tous déjà développé une application Web contenant un formulaire au sein duquel vous avez inséré une liste de choix, en utilisant la balise HTML <select>.
Mais une liste déroulante n'est réellement utilisable que si elle ne contient que peu d'entrées ; pas plus d'une trentaine, dirais-je, au grand maximum.
Et une liste <select> force l'utilisateur à choisir une des valeurs que vous lui proposez.
Dans certains cas, vous pouvez vouloir :
- aider votre utilisateur, en lui proposant une liste de choix
- tout en lui permettant d'effectuer une saisie libre.
Par exemple, pensons à la saisie d'une adresse E-Mail lors de la rédaction d'un courier électronique[1] :
- l'utilisateur peut commencer à saisir une adresse
- vous pouvez lui proposer une liste issue de son carnet d'adresses, filtrée par sa saisie
- il peut :
- soit sélectionner l'une des adresses proposées,
- soit en saisir une autre.
Cet article va nous permettre d'apprendre à mettre en place ce type de système de propositions, en utilisant le Framework JavaScript Scriptaculous.
Script.aculo.us :: Ajax.Autocompleter
Scriptaculous est une bibliothèque d'interface JavaScript basée sur le framework prototype.js, que nous avons déjà utilisé dans d'autres articles.
Cette bibliothèque propose un composant qui vous permettra :
- de définir un champ de saisie dans un formulaire
- de proposer à l'utilisateur des suggestions correspondant à sa saisie
- en chargeant ces suggestions depuis un serveur web via une requête Ajax.
Ce composant est nommé Ajax.Autocompleter.
Le principe d'utilisation est relativement simple. Vous avez besoin de trois éléments :
- un formulaire HTML,
- quelques lignes de JavaScript pour le rendre dynamique,
- et un script sur un serveur, qui sera appelé via une requête Ajax.
Formulaire HTML
Pour fonctionner, Ajax.Autocompleter se base sur :
- un formulaire HTML - un champ input text,
- et un élément au sein duquel seront affichées les propositions - un div, en général.
Pour notre premier exemple, nous considérerons que vous souhaitez permettre à un utilisateur de saisir le nom d'un département, avec auto-complétion.
La portion de code HTML correspondante serait la suivante :
<form action="" method="get"> Saisissez un nom de département : <input type="text" id="departement" name="departement"/> <div id="departement_propositions" class="autocomplete"></div> </form>
Initialisation de l'objet Ajax.Autocompleter
La seconde étape est de créer une instance d'objet Ajax.Autocompleter, en lui indiquant qu'il devra travailler sur la portion de formulaire que nous venons de créer :
// Instanciation de la classe Autocompleter, pour le champ de saisie "departement" new Ajax.Autocompleter( "departement", // id du champ de formulaire "departement_propositions", // id de l'élément utilisé pour les propositions "serveur-departement.php", // URL du script côté serveur { paramName: 'departement', // Nom du paramètre reçu par le script serveur minChars: 1 // Nombre de caractères minimum avant que des appels serveur ne soient effectués });
Le principe est le suivant :
- vous créez une instance d'objet Ajax.Autocompleter
- le premier paramètre est l'identifiant du champ de formulaire dans lequel l'utilisateur saisira le texte à auto-compléter
- le second est l'identifiant de l'élément HTML au sein duquel seront affichées les propositions
- le troisième est l'adresse du script côté serveur qui recevra en paramètre la saisie, et devra retourner la liste des propositions
- et le dernier est une série d'options. Ici, nous passons les suivantes :
- paramName : Le nom du paramètre qui sera reçu par le serveur.
- minChars : nombre de caractères minimum avant qu'un appel serveur ne soit effectué. Pour une liste de 100 départements en France, on peut proposer des suggestions d'auto-complétion dès qu'un caractère est saisi.
Par défaut, la saisie de l'utilisateur sera envoyée en POST au script serveur.
Script serveur renvoyant les suggestions
Enfin, la dernière étape est de développer un script côté serveur, qui sera appelé par l'objet Ajax.Autocompleter lorsque l'utilisateur saisira du texte dans le champ de saisie.
Ce script recevra en entrée la saisie de l'utilisateur, et devra renvoyer en sortie une liste composée des différentes suggestions correspondant à sa saisie - de manière générale, une liste des possibilités commençant par celle-ci.
Scriptaculous attend que les suggestions soient renvoyées au sein d'une liste HTML : un élément <ul> regroupant plusieurs éléments <li> - chacun correspondant à une suggestion.
Dans le cas de notre exemple, le serveur reçoit en POST une variable nommée "departement" (le paramName précisé à l'instanciation de la classe Ajax.Autocompleter).
A lui de déterminer quoi renvoyer.
Par exemple, notre script serveur pourrait être le suivant :
(Algorithme extrêmement naïf : si la saisie correspond au début d'un département, alors on le renvoit. Un tel algorithme serait catastrophique en terme de performances sur un volume plus gros - et stocker des milliers de lignes directement dans un tableau PHP ne tiendrait rapidement plus dans la limite mémoire autorisée pour vos scripts)
<?php $departements = array( 'Ain', // ... 'Ille-et-Vilaine', 'Indre', 'Indre-et-Loire', 'Isère', // ... 'Sarthe', // ... 'La Réunion', ); echo "<ul>\n"; foreach ($departements as $departement) { if (stripos($departement, $_POST['departement']) === 0) { echo " <li>$departement</li>\n"; } } echo "</ul>"; ?>
(Pour éviter d'avoir un code source trop long, j'ai coupé la liste des départements - vous la trouverez, au besoin, sur le site de l'INSEE.)
Si l'utilisateur saisit un "i", le serveur enverra en retour :
<ul>
<li>Ille-et-Vilaine</li>
<li>Indre</li>
<li>Indre-et-Loire</li>
<li>Isère</li>
</ul>
Ce qui correspond bien à la liste des départements français commençant par... "i".
Et s'il affine sa saisie : "in", le serveur renverra, comme attendu :
<ul>
<li>Indre</li>
<li>Indre-et-Loire</li>
</ul>
A tout moment, l'utilisateur peut cliquer sur l'une des propositions, et celle-ci remplacera alors la saisie dans le champ de formulaire.
Le choix d'un élément est aussi possible au clavier.
Autocompléter avec style
Forcément, avec les styles par défaut, le rendu n'est pas des plus appréciables :

Mais, heureusement, Scriptaculous permet de définir des styles pour embellir tout ça.
Au moment où nous avons défini l'élément HTML contenant la liste de suggestions, nous lui avons affecté une classe CSS :
<div id="departement_propositions" class="autocomplete"></div>
Il suffit de définir les styles souhaités, en se basant sur de div, et sur cette class, "autocompleter", dans notre cas.
Par exemple, nous pourrions définir les styles suivants :
div.autocomplete { position: absolute; width: 500px; background-color: white; border: 1px solid #888; margin: 0px; padding: 0px; } div.autocomplete ul { list-style-type: none; margin: 0px; padding: 0px; max-height: 20em; overflow: auto; } div.autocomplete ul li.selected { background-color: #ffb; } div.autocomplete ul li { list-style-type:none; display: block; margin: 0; padding: 2px; cursor: pointer; }
Tout de suite moins spartiate... Et libre à vous d'améliorer cela pour l'intégrer à votre charte graphique !
Nous verrons dans un futur article que les fonctionnalités offertes par Ajax.Autocompleter ne s'arrêtent pas là : nous verrons comment
- exploiter les données saisies par l'utilisateur,
- en lui affichant des suggestions plus détaillées,
- et le tout avec des données correspondant à un cas "réel".
A bientôt, donc !
Pour être averti lors de la publication de nouvelles entrées, n'hésitez pas à vous abonner au flux RSS ou ATOM des articles de mon blog !

Commentaires
bonjour, mais j'ai une question ( hors sujet
) , la methode $ admet l'ID ou l'element lui meme, pour la premiere pas de probleme, mais le 2 argument je ne comprend pas ... tu px m'expliquer
Si votre document HTML contient un bloc défini ainsi :
Vous pouvez vouloir travailler sur ce bloc... Que ce soit via le DOM, ou, plus probablement vu le contexte, en employant les méthodes de prototype.js
Dans le second cas, admettons que vous vouliez écrire une fonction qui prend en paramètre un élément, et effectue un traitement sur cet élément.
Ne serait-il pas intéressant que cette fonction accepte en paramètre indifféremment l'identifiant de l'élément, ou l'élément lui-même ?
La fonction
$()permet cela :- Vous lui passez un identifiant ou un élément,
- et elle retourne l'élément correspondant,
- en l'enrichissant au passage : elle lui rajoute toutes les méthodes que prototype.js fourni pour travailler sur... des éléments.
- (et, éventuellement, celles s'appliquant aux éléments de formulaire, dans le cas où il s'agissait d'un élément de formulaire)
Par exemple, vous pourriez définir la fonction JS qui suit :Cette fonction peut être appelée soit sur un identifiant d'élément :
testFunc('test');Soit directement sur un élément du DOM :
testFunc(document.getElementById('test'));Soit même sur un élément déjà étendu via prototype :
testFunc($('test'));Elle agira toujours de la même manière.
Pour plus d'informations (notamment pour d'autres lecteurs qui passeraient par ici) :
lors que je rajoute les div dans la page de génération le .selected ne fonctionne plus ce que n'est pas très pratique ... A tu une autre solution?
Merci pour ta réponse
Merci pour ce commentaire
A froid comme ça, je manque un peu d'idées, et je ne me suis encore jamais posé la question ^^
Quoi qu'il en soit, le principe de poser 36 <div> pour arriver à des coins arrondis me parait un peu lourd à mettre en place (et pas forcément évident à intégrer avec script.aculo.us) et à maintenir.
Si tu es patient, tu peux toujours attendre quelques années que CSS3 soit un peu plus présent au sein des navigateurs, et utiliser http://www.w3.org/TR/2002/WD-css3-border-20021107/#border-radius.
(je doute que tu sois suffisamment patient ^^ )
Si tu es moins patient, et que des arrondis sous Firefox et Safari te conviennent, en ne tenant pas compte d'Internet Explorer, tu peux jouer avec les propriétés CSS du genre -moz-border-radius et -webkit-border-radius ; Cf http://www.css3.info/preview/rounded-border/ ou http://www.amaryllidaceae.org/web-jardin/CSS/moz-border-radius.htm par exemple (encore que tu rencontreras sûrement des problèmes quand la ligne "selected" sera la dernière de la zone à bordures arrondies
Après, pour avoir quelque chose qui fonctionne sous tous les navigateurs... j'ai bien peur qu'il te faille continuer dans la voie sur laquelle tu as commencé...
Quoi qu'il en soit, bon courage !
Et si tu parviens à mettre en place une solution pleinement fonctionnelle sur les principaux navigateurs, je veux bien que tu postes un lien ; ça peut toujours intéresser d'autres lecteurs
Bonjour.
:
J'ai un affichage d'erreur par firebug (et rien ne s'affiche dans le div (forcément!)
Ajax.Autocompleter is not a constructor.
Voici le script HTML/javascript utilisé :
<FORM ACTION="#" METHOD="get">
<input type="text" id="nomp" name="nomp">
<div id="name_update"></div>
<h4><center>Choisissez dans la liste proposée, <br>puis
cliquez sur : </span><INPUT type="submit" name="Valider" value=" Ok " ></center></h4>
<script language="javascript" type="text/javascript">
new Ajax.Autocompleter(
"nomp",
"name_update",
"noms_auteurs.php",
{method:"get",paramName:"nomp"}
);
</script>
Je précise que les fichiers prototype.js et scriptaculous.js sont bien présents et que la page noms_auteurs.php s'affiche correctement (test effectués !)
Connais-tu la cause de ce problème et si oui : As-tu un remède ?
Merci d'avance pour ton aide !
Je connais au moins deux problèmes qui peuvent causer l'apparition de ce messages d'erreur :
- Mais il ne semble pas que ce soit ça le problème, ici, puisque vous avez bien inclut
- (Vérifiez tout de même que vous chargez bien
- Soit que vous ayez (qui pose problème, puisque
- Soit même que vous ayez ce type de schéma de chargements (ce qui peut arriver sur un gros projet développé en équipe) :
Êtes-vous dans ce genre de situation ?scriptaculous.jsn'est pas chargé -- ou, plus précisément,controls.js(qui requiert elle-mêmeeffects.js) n'est pas chargéscriptaculous.jsscriptaculous.jsavant de tenter l'instanciation de votre contrôle ? )prototype.jsest chargée aprèsscriptaculous.jsscriptaculous.jsrequiertprototype.js) prototype.js chargé après scriptaculous.jsprototype.js, puisscriptaculous.js, puisprototype.jsune seconde fois ; auquel cas, le second chargement deprototype.jsannulera la surcharge de la classeAjaxeffectuée par scriptaculous pour lui intégrer l'Autocompleter.Si non, votre application est-elle déployée quelque part, sur un serveur accessible publiquement ?
Bon courage,
P. Martin
Bonjour.
Apparemment, je ne suis dans aucune de ces deux situations :
Lorsque j'affiche le code source (par source chart de firefox), j'obtiens ça dans le HEAD :
<head>
<title>titre</title>
<script language="javascript" type="text/javascript" src="js/prototype.js">
</script>
<script language="javascript" type="text/javascript" src="js/scriptaculous.js">
</script>
<script type="text/javascript" src="http://momserveur/js/builder.js">
</script>
<script type="text/javascript" src="http://momserveur/js/effects.js">
</script>
<script type="text/javascript" src="http://momserveur/js/dragdrop.js">
</script>
<script type="text/javascript" src="http://momserveur/js/controls.js">
</script>
<script type="text/javascript" src="http://momserveur/js/slider.js">
</script>
</head>
Malheureusement, ce site est un intranet (c'est pour cela que j'ai
remplacé l'adresse réelle par <monserveur> dans les lignes précédentes) dont je ne peux pas donner l'accès , désolé !
Dernière précison : ce site est sous SPIP(qui utilise aussi des
bibliothèques Ajax internes )mais cette page est générée en dehors
de ce CMS.
A tout hasard, est-ce que exécuter les commandes JS de création de l'Autocompleter directement dans la console de Firebug, une fois la page complètement chargée, fonctionne ? Ou est-ce que ça lève le même type d'erreur ?
Bravo Joli tuto, j'essai ca tout bientot, je reviendrai poster si j ai des problemes
Merci
Bon courage !
Merci beaucoup pour ce tuto il m'as bien aider et en plus il marche . J'essai de l'utiliser avec un quickform de pear mais il ne reconnais pas l'"id" ou le "name" d'un input de formulaire .
et firebug me sort :
il y a un null c'est donc qu'il ne reconnais pas l'id
[Edit P. Martin 20/03/2008 : Corrections mise en page]
Je n'ai encore jamais eu l'occasion d'utiliser Quickform. Que donne le code source HTML généré ?
Note : Dans l'instanciation de votre Ajax.Autocompleter, vous semblez utiliser le même id pour le champ de saisie, et l'élément d'affichage des propositions ; cela risque de poser problème (Avec Scriptaculous 1.7b3, le champ de saisie n'apparait pas - sans qu'une erreur JS ne soit levée)
Quelle version de Scriptaculous / prototype.js utilisez-vous ?
Réflexion faite (une fois HTML_QuickForm installée et mon script d'exemple modifié en conséquence) : j'ai exactement la même erreur que vous...
Peut-être est-ce moi qui utilise mal QuickForm, mais si les seules lignes de PHP inclues dans la génération de ma page HTML sont les deux que vous avez reproduit, je n'ai aucun formulaire qui apparait, y compris dans le source HTML de la page.
Note : en rajoutant
$form->display();le problème reste le même, cela ditEt, effectivement, il n'y a pas d'attribut id de généré : QUickForm a généré le code HTML suivant :
A priori, pour régler le problème, QuickForm accepte un quatrième paramètre pour la méthode
addElement: un tableau d'attributs / valeurs qui sont ajoutés à l'élément HTML généré.En ajoutant un couple dont la clé est 'id' à ce tableau, on a un attribut id généré dans le code HTML ; et problème corrigé. Le code de génération du formulaire devient : (J'ai copié-collé votre code à la sauvage, en le patchant pour qu'il fonctionne avec ma page de test, au sein de laquelle je travaille généralement sur un champ "villes" ; à vous d'adapter pour votre cas)
Ce qui entraine la génération du code HTML suivant :
En supposant que le reste de la page (élément d'affichage des propositions, et instanciation correcte de l'Autocompleter) est OK, l'
Ajax.Autocompleters'affiche, à présentBon courage,
Bonjour,
Je débute en développement Web et j'aimerai savoir si quelqu'un pourrait poster un tuto pas à pas avec les noms de fichiers à inclure et ou placer les bouts de codes qui se trouvent sur cette page.
Merci
Bonjour,
j'ai également des soucis pour implémenter ce script... est-ce possible d'avoir la page source entière ou encore mieux un exemple fonctionnel basique pour comprendre le mécanisme et l'adapter à mes besoins ?
Merci d'avance,
Mike
Je viens d'ajouter en pièce jointe à cet article un exemple complet et fonctionnel :
(Cf tout en bas de l'article, avant les commentaires)
- Page HTML "cliente"
- Script JS créant l'
- Les différentes bibliothèques (dernières versions au jour d'aujourd'hui : prototype.js en version 1.6.0.1 et script.aculo.us en version 1.8.1)
- Page PHP "serveur" appelée pour obtenir la liste des départements correspondant à la saisie
- Et page PHP recevant les données du formulaire une fois celui-ci validé.
En espérant que cela vous aide à comprendre le fonctionnementAjax.Autocompleter(Avec un peu de chance, cela devrait répondre à vos deux derniers commentaires, en un seul jet ^^ )
Bon week-end et bon courage !
Bonjour,
très bon article, merci !
Par contre, il y a une petite erreur dans l'archive pour que celle ci soit fonctionnelle ; le nom du script serveur n'est pas le bon.
Par ailleurs, il manque également le css.
J'ai effectivement un peu tout mélangé dans mes fichiers locaux... j'avais donc des fichiers en ancienne version encore présents, des fichiers avec des noms non mis à jour, ... et le tout qui continuait à fonctionner sur mes environnements de développement...
Le problème devait maintenant être corrigé : je viens de mettre en ligne une nouvelle version de l'archive, qui corrige les points suivants :
- Ajout du fichier autocompleter-exemple-1.css
- Modification de l'inclusion de la CSS dans le fichier HTML, pour utiliser le fichier ci-dessus, et non mon ancienne version
- Correction de l'URL dans le fichier JS, pour pointer sur autocompleter-exemple-1-serveur.php, et non mon ancienne version.
Merci pour votre report !En espérant que je n'aie pas oublié une autre modif à effectuer,
Bonne fin de soirée,
J'ai été confronté au pb sous FF (Ajax.Autocompleter is not a constructor)
Apparement sous FF l'ordre du code est très importante pour cette objet.
J'ai donc fait comme ceci :
Et dans le galerie.js, j'ai mis dans la première fonction
le new ew Ajax.Autocompleter.
Si je mets cette fonction en deuxieme. Ce ne marche plus.
Le code de galerie.js
[Edit P. Martin 20/04/2008] Remise en forme (il doit y avoir un bug quelque part dans le code de mise en forme des commentaires...)
Merci, donc
j'ai moi aussi le problème du this.element is null
voilà ce que donne la stack dans firebug et impossible de trouver ce qui cloche. C'est rageant
baseInitialize(null, "divtiersnom", Object paramName=tiersnom)controls.js (line 53)
initialize("tiersnom", "divtiersnom", "../scr/autoRequete.php", Object paramName=tiersnom)controls.js (line 347)
klass()prototype.js (line 48)
form.php?obj=courrier()
j'ai trouvé
mon générateur de code générait le <INPUT après l'appel à Ajax.Autocompleter et donc le id correspondant à l'INPUT n'existait pas
à la fois la question et la réponse ; voila qui est agréable à lire ^^
Merci, en tout cas, d'être repassé par ici pour indiquer la cause du problème
Et bonne continuation !
Bonjour. Premièrement, bravo pour le tuto. Je me posais cependant une question. La div receptacle de la requête sql peut elle être ailleurs que juste sous l'input text ou s'effectue la recherche? Je m'explique : Sur ma page j'ai mon champ de recherche, l'autocompleter marche nickel mais j'aimerai que les réponses s'affiche dans une div se trouvant plus bas dans ma page. Or l'affichage est quelque peu détruit
. Il m'affiche le résultats de la requete sous l'input text. Peut on remédier à ça et si oui comment? Merci d'avance et encore bravo pour le tuto.
Quelqu'un pourrait m'aider à comprendre cette erreur?
Merci d'avance.
A tout hasard, est-ce que l'élément sur lequel vous créez votre Autocompleter (le premier paramètre passé à
new Ajax.Autocompleter) existe ?Sa non-existence pourrait expliquer ce problème, à priori...
Bonjour Pascal,
Félicitations pour cet excellent tutorial.
Je constate tout de même un problème avec IE. La div ne tient pas compte de la propriété max-height qui ne fonctionne pas avec IE et donc affiche l'intégralité des résultats sans scrollbar.
Cela peut être contré en fixant la propriété height de la DIV, et là la scrollbar apparait. MAIS autre problème, plus embêtant celui-ci, l'exploitation de cette scrollbar est impossible, le premier clic de souris fait disparaitre la liste.
Merci d'avance de me dire si vous avez vous aussi constaté le problème et dans ce cas si vous l'avez résolu.
Bonsoir,
Je n'ai pas rencontré personnellement ce problème (et je n'ai pas d'IE6 sous la main pour tester), mais vous n'êtes apparemment pas le seul à l'avoir vu.
En fouillant un peu, je suis tombé sur les échanges suivants sur le Trac de RoR / scriptaculous :
Je n'ai pas vraiment lu dans les détails, mais, avec un peu de chance, quelques informations donnés sur ces billets vous seront utiles...
Cela dit, ces tickets sont anciens, mais le problème semble toujours présent, si on en croit par exemple :
Désolé de ne pas pouvoir vous en dire plus...
(Et sans IE6 à portée de main pour tester, je peux difficilement fouiller par moi-même...)
Quoi qu'il en soit, bon courage !
Malheureusement, le problème n'est pas spécifique qu'à IE6, il en est de même avec IE7 et IE8...
Je regarderais mieux les tickets en détail pour voir s'ils apportent une solution satisfaisante.
Oh

ok
Si vous trouvez une solution, je suis preneur !
"La div ne tient pas compte de la propriété max-height qui ne fonctionne pas avec IE et donc affiche l'intégralité des résultats sans scrollbar."
Rajouter la propriété height qu'IE comprendra
2ème problème
"l'exploitation de la scrollbar est impossible, le premier clic de souris fait disparaitre la liste."
Dans le control.js rajouter la condition dans la méthode onBlur.
onBlur: function(event) {if((event.x - parseInt(this.update.style.left)) > parseInt(this.update.style.width) |
(event.y - parseInt(this.update.style.top)) > parseInt(this.update.style.height)) {
setTimeout(this.hide.bind(this), 250);
this.hasFocus = false;
this.active = false;
}
},
Autre comportement gênant pour moi
Le fait que la touche tabulation sélectionne la ligne; pour éviter cela il suffit de rajouter le code suivant dans la méthode onKeyPress
Houa !
Merci pour ces informations !
(un jour ou l'autre, je sens que ça me servira ^^ et nous ne sommes sûrement pas les seuls dans ce cas
)
Bonjour,
tout d'abord bravo pour tous vos tuto qui sont des modèles du genre
Je rencontre un souci sans doute tout bête mais qui me bloque énormément.
Contexte :
Dans le cadre d'une appli web je dois traiter des formulaires contenant énormément de champs <input type="text"> utilisant des instances Ajax.Autocompler qui font référence à plusieurs tables de la base MySql. Ces formulaires sont de plus construit dynamiquement par un script PHP en fonction du contexte de l'utilisateur. Ce script PHP ajoutant quand cela est nécessaire les script d'auto-complétion aux balises input. Jusqu'à présent ces formulaires étaient appelés via un require_once() suite à un rafraichissement de la page.
Mon problème
Dans cette nouvelle version, ces formulaires sont chargés en utilisant Ajax.Updater et du coup, comme il se doit, les balises <script></scrip> n'apparaissent plus.
Quelle méthode propre et simple à maintenir puis-je utiliser pour générer dynamiquement toutes ces instances Ajax.Autocompleter ? Sachant que je ne peux pas toutes les définir à l'avance puisque le nombre de cas serait gigantesque.
Désolé d'avoir été un peu long mais je souhaitais décrire clairement le contexte.
Merci
Bonsoir,
Je ne comprends peut-être pas parfaitement votre question, mais ne pouvez-vous pas créer l'AutoCompleter au retour de la requête Ajax ramenant les informations qui permettent de créer le champ de formulaire ?
(Après réflexion, si vous passez par
Ajax.Updater, cela risque de ne pas être évident : il vous faudra peut-être modifier vos appels pour utiliserAjax.Request, qui est plus bas niveau... )Sinon, est-ce que basculer l'option
evalScriptsdeAjax.Updater(Cf http://prototypejs.org/api/ajax/updater ) ne répondrait pas à votre besoin ?Quoi qu'il en soit, bon courage !
Merci pour votre réponse.
C'est assez tordu en effet. J'ai bien noté l'option
evalScriptsqui permet d'intégrer du javascript à condition de respecter la bonne structure :remplacer
function coolFunc() {// Amazing stuff!
}
par
coolFunc = function() {// Amazing stuff!
}
mais dans mon cas, et c'est justement mon problème, comment intégrer par exemple votre script d'autocompleter
dans une page page appelée via un
ajax.updaterouajax.requestMerci encore pour votre attention
Bon j'ai envoyé une réponse avec du code mais j'ai le sentiment d'avoir mal utilisé les balise code pour cela. Je recommence donc.
Donc encore merci pour votre réponse.
En utilisant
evalScriptsàtrueon sait que l'on peut intégrer du code javascript dans un page à condition de ne pas écrire ses fonctions comme celafunction maFunction { }mais en les rédigeant comme celamaFunction function() {}.En fait ma question est comment rédiger une instance ajax.autocompleter pour qu'elle soit conservée dans une page appelée par un
ajax.updaterou unajax.request.Bon je me réponds à moi même en quelque sorte et je clos cette partie du fil.
La solution était en fait toute simple comme souvent.
J'ai simplement ajouté une variable global au niveau du script php qui rédige le formulaire.
Cette variable mémorise la liste des ID des input créés au fur et à mesure.
Puis dans la age du form, tout en bas de page un script javascript qui envoi cette liste d'IDs à un script générique qui créé les instances autoComp.
Merci en tout cas,
Cdt
Philippe
Eh bien merci à tous, à Pascal pour cet éclaircissent avec ce bel exemple. C'est vrai que la doc original est un peu sommaire...
Bonne programmation !
Hello la compagnie!
Je viens vers vous au sujet de l'auto-completion avec scriptaculous
J'ai un souci avec ie
Ca ne fonctionne pas la première fois, rien ne s'affiche dans mon div résultat
Mais aucune erreur javascript
Voici mon code :
Aurais-je mal fait qqch ?
Si vous avez une idée je suis preneur
Ca fonctionne correctement sous firefox, opera, safari et chrome
Mais pour ce foutu ie de m.... non, enfin si ça fonctionne correctement mais pour une seconde saisie
lol
merci d'avance pour vos lumières
Salut,
Comme mon collègue plus haut "Jeff" j'ai le meme problème à la premiere execution sous IE7 (pire sous IE6 en + de rien faire il perd le focus )!!!
J'ai éssayé plein de chose mais je trouve pas T_T
Si quelq'un a une solition, je suis preuneur j'en ai vraiment besoin !
Meme une solution bricolée qui force par exemple un Keydown à la premiere autocompletion ou un truc du genre ^^
Merci d'avance les gens ^^
Hello les développeurs fou ^^
Bien, au sujet du bug sous ie et l'
ajax.autocompleter, je viens de fixer le bugAprès m'être bien cassé le crâne à débugger le framework scriptaculous, j'ai trouvé d'où venait le souci
Ca se trouve dans le fichier
control.jsline 95 dans la fonctionshow:function(){...}Vous devez avoir cette ligne
A remplacer par ces lignes ci
try {if (Element.getStyle(this.update, 'display') == 'none') this.options.onShow(this.element, this.update);
}
catch(e) {
this.options.onShow(this.element, this.update);
}
Et tout fonctionne correctement pour IE dorénavant
Et bien, bonne programmation à tous!
Juste oublié de préciser la version utilisée du framework pour ceux qui vont revenir plus tard consulter ce bug
script.aculo.us controls.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008
Rholala comme je t'aime trop Jeff
Ca marche nikel sur IE7 !!!
Par contre toujours le bug d'IE6 (perte de focus à la première autocompletion) mais c'est pas grave !!
Franchement un gros merci j'aurais pas pu trouver çà tout seul !!
Joyeusement
Bonsoir,
J'arrive un peu après la bataille, mais content de voir que vous avez trouvé solution à votre problème -- et merci d'avoir posté ladite solution !
Bonne continuation !
Salut,
Je voudrai savoir s'il est simple d'activer l'autocompletion en cliquant sur un bouton ou une image.

Je m'explique je souhaite proposer a mes utilisations une image loupe,a cote du formulaire, qui leur permet de voir la liste complete des informations disponible, en plus de l'autocompletion sur le formulaire bien entendu.
Idealement je souhaiterai utiliser le meme mecanisme, mais la j'avoue je seche un peu
Et donc si tu as une idee je suis preneur
Dans tous les cas felicitations pour tes tutos interressants et de qualites.
@+
Bonsoir,
Malheureusement, il ne me semble pas que l'
Ajax.Autocompleterde script.aculo.us fournisse ce type de fonctionnalité :- je ne vois rien dans la doc ( http://wiki.github.com/madrobby/scriptaculous/ajax-autocompleter ) à propos d'un bouton supplémentaire sur lequel il "écouterait" -- encore qu'on puisse certainement s'en sortir avec une astuce du style lever un événement clavier sur le champ d'autocomplétion.
- Et, pour avoir une liste "de toutes les propositions", il faudrait n'avoir rien saisi dans le champ texte... Ce qui pose problème si l'utilisateur a déjà commencé à saisir quelque chose... Mais à la limite, on peut n'accepter de n'afficher la liste entière que si l'utilisateur n'a rien saisi, auquel cas on retombe sur l'éventuelle "astuce" citée au-dessus ^^
Pour le coup de "lever un événement clavier sur le champ input text", quid de passer parElement.firefournie par prototype ?(je n'ai pas essayé, mais, avec un peu de chance... )
Quoi qu'il en soit, bon courage !
Salut Pascal,
Apres bcp de galere j'ai enfin trouve une solution, et c'est plutot simple d'ailleurs !!! lol
Il m'a suffit de declarer une variable sur l'objet Ajax.Autocompleter :
et ensuite de definir l'attribut "onclick" sur mon image avec le code "AutoComp.activate()"
Et voila le tour est joue
Seul bemol je dirai c'est que ca prend automatiquement la valeur du champ en cause, mais cela n'est pas choquant
J'espere que ca aidera certain.
Merci encore.
Ah oui, pas mal non plus, effectivement ^^
Bonjour Pascal,
Un grand bravo à toi.
Tout d'abord, excellent ton tuto, il m'a servit énormément, et je l'utilise à toute les sauces
Mais bon, si je viens là tu dois te douter que j'ai un petit problème, alors voila je me lance.
Je cherche à lier, via ton modèle d'autocompletion, deux champs.
Je m'explique :
-J'ai un premier champ en autocompletion, (disons marque de chaussure par exemple)
-Je souhaite créer un deuxième champ en autocompletion qui, selon la marque choisit auparavant, me donnera les modèles concernés.
Alors en gros, ce que je souhaite faire, c'est ajouter une variable lors de la création de mon nouvel autocompeter.
Et la je bloque. Il faudrait que cette variable soit la marque précédemment choisit, j'ai donc pensé utiliser un event.observe{'blur'} mais sans succès malheureusement.
Voila, donc si une aide était possible, j'en serait ravis. Pour ma part je vais continuer mes recherches, et posterai la solution si je trouve.
Merci bien
Cordialement
Mayous
Salut a tous
C'est la 1ere foi que j utilise AJAX donc faut pas m'en vouloir si je pause des questions qui peuvent paraitre idiotes.
Chez moi rien ne marche meme pas l'autocompletion, j ai pourtant bien DL le dossier \scriptaculous dans le quel je fais mes tests en plus j ai IE
l architecture du dossier donne:
scriptaculous
-> test.html // ou se trouve le questionnaire -> serveur-departement.php // j ai fais un cc du code php -> client-1.js // ou se trouve le JS -> les dossiers src, test, lib/scriptaculous.jsPour Mayous si sa peut répondre a ta question va voir:
http://www.toutjavascript.com/savoi...
le paragraphe 5
Salut, votre tuto m'aide bcp bien que je débute, plusieurs questions?
- la fonction init charge au debut correspond a quoi?
- N'ayant pas la fonction init sous la main j'ai appele l'autocompleter par une fonction avec onkeyup="toto()" cela fonctionne sous firefox et ie mais pas avec chrome,voyez vous une raison
le message erreur est Ajax n'est pas defini dans New Ajax.Autocompleter
Merci pour votre aide si vous avez une soluce.
A bientôt
Hello,
Merci pour ce tuto très intéressant concernant l'autocompletion...
Je souhaiterais créer un module d'autocompletion en utilisant (ou non) une base de donnée mysql comprenant plus de 100 000 enregistrement... Cependant, après avoir essayé divers solutions et frameworks, j'ai un même soucis qui revient : La performance...
Es ce que vous auriez une petite idée optimisée pour exécuter un script d'autocompletion sur un grand nombre de données.. :
Je pense que dans ces cas la, MySQL est à proscrire, surtout s'il doit retourner rechercher des résultats sur des milliers d'enregistrement...
J'ai pensé à un système utilisant des fichiers textes... Mais je vous avoue que je ne sais pas vers quelle solution optimisé me tourner...
Cordialement,
bonjour,
merci pour ce tuto !
je suis parvenu à mettre en place l'autocompletion mais je sèche sur un problème précis.
je voudrai faire en sorte que si qlq commence à saisir, puis clic hors du champs de saisie en ne selectionnant aucun des choix proposés que le 1er choix soit pris automatiquement.
je pense que celà doit être possible ( quand on clique hors du champs de saisie, la liste de choix disparait donc l'evenement mouseOver doit être géré + comment recuperer le 1er element de la liste de choix ? ) mais j'ai dus mal à manipuler ces classes
merci d'avance à ceux qui pourront m'éclairer