Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Autocompletion sur plusieurs champs (YUI et scriptaculous)

4 réponses
Avatar
KooK
Bonjour,

Je possede une liste d'elements et plusieurs champs de saisie _appeles
champs lies par la suite.
Je dois mettre en place une autocompletion sur ces champs avec comme
consigne que si un element a ete saisi dans un des champs lies, il ne
doit plus apparaitre dans la liste proposee.
Contrainte supplementaire, je peux avoir plusieurs champs lies dans la
même page (donc plusieurs liste).


Pour mettre en place l'autocompletion, j'ai d'abord essaye la
bibliotheque de yahoo YUI.
J'ai ecrit une classe qui a comme attribus la liste d'elements, un
tableau d'identifiants des champs de saisie (les champs lies) ainsi
qu'une reference à une fonction.

Pour chaque identifiant du tableau (donc pour chaque champ), je cree un
objet AutoComplete, auquel je dois associer une ref de fonction qui
renverra une liste _liste mise a jour a chaque frappe au clavier.
"this.__oACDS = new YAHOO.widget.DS_JSFunction(ref_func);
this.__oAutoComp = new YAHOO.widget.AutoComplete(id, id_div, this.__oACDS)"
La fonction qui renvoie la liste doit connaitre les champs lies, c'est
donc une methode ma classe.

Le probleme, c'est que au moment de l'appel a cette fonction 'this'
represente la page, mes connaissances en js étant encore limité, j'ai
palier le pb en appelant un fonction qui elle invoque ma methode.

J'obtiens donc :
var a_ids = new Array('ref', '1');
var a_liste = [['brett'], ['brad'], ['broke'], ['brook'],
['brenda'], ['betty'], ['becky']];
//equivalent a 'onload'
YAHOO.util.Event.addListener(this,'load', grp_un = new
GroupInput(a_ids, a_liste, fn_loadList));

function fn_loadList(sQuery)
{ return grp_un.loadList(sQuery); }

ou GroupInput est ma classe. sQuery est le contenu du champ en cours de
saisie, envoye par YUI.
Ma question : peut-on faire plus 'propre', sans cette fonction
'fn_loadList' et si oui, comment ?

---------------
J'ai egalement essaye la bibliotheque scriptaculous.
Cette fois c'est plus propre. Ma classe a seulement comme attribus la
liste d'elements et un tableau d'identifiants des champs de saisie (les
champs lies) ainsi que 2 methodes loadList qui renvoie la liste des
elements et createAutocompleter qui cree un nouvel objet
'Autocompleter.Local' avec comme liste, ce qui est renvoye par loadList.
J'ai donc cette fois _execute au chargement de la page:
var a_ids = new Array('ref', '1');
var a_liste = ['bob', 'rob', 'tod', 'brett', 'brat', 'brook', 'broke'];
grp_un = new GroupInput(a_ids, a_liste);
avec une invocation de createAutocompleter a la prise de focus de chaque
champ :
<input id='ref' onfocus="grp_un.createAutocompleter('ref')"/><br />
<input id='1' onfocus="grp_un.createAutocompleter('1')" /><br />

Cette fois ce qui me chagrine c'est que des objets soient recrees a
chaque prise de focus.

-------------
Les 2 solutions fonctionnent. Cependant, j'aurais voulu travailler avec
des objets crees une fois au chargement de la page (comme avec YUI),
mais sans traitement exterieur à ma classe.

Merci,
Et si je n'ai pas été assez clair dites-le.

KooK

4 réponses

Avatar
ASM
Bonjour,

Je possede une liste d'elements et plusieurs champs de saisie _appeles
champs lies par la suite.
Je dois mettre en place une autocompletion sur ces champs avec comme
consigne que si un element a ete saisi dans un des champs lies, il ne
doit plus apparaitre dans la liste proposee.
Contrainte supplementaire, je peux avoir plusieurs champs lies dans la
même page (donc plusieurs liste).


Brrrooufff ! ! rien que çà ?

voir à voir (au moins pour le début de la question)
<http://groups.google.fr/group/comp.lang.javascript/msg/ecfed36c8f308c3b>
<http://groups.google.com/group/fr.comp.lang.javascript/browse_frm/thread/36585c2cc7d18767/9063206f85d5ebc7?#9063206f85d5ebc7>



--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé

Avatar
KooK
Bonjour,

Je possede une liste d'elements et plusieurs champs de saisie _appeles
champs lies par la suite.
Je dois mettre en place une autocompletion sur ces champs avec comme
consigne que si un element a ete saisi dans un des champs lies, il ne
doit plus apparaitre dans la liste proposee.
Contrainte supplementaire, je peux avoir plusieurs champs lies dans la
même page (donc plusieurs liste).


Brrrooufff ! ! rien que çà ?

voir à voir (au moins pour le début de la question)
<http://groups.google.fr/group/comp.lang.javascript/msg/ecfed36c8f308c3b>
<http://groups.google.com/group/fr.comp.lang.javascript/browse_frm/thread/36585c2cc7d18767/9063206f85d5ebc7?#9063206f85d5ebc7>


Je te remercie de ta réponse mais je m'intéresse moins à
l'autocompletion (puisque YUI et scriptaculous s'en charge) qu'à la
structure/ à l'organisation du code. Comme je l'ai mentionné, mes codes
fonctionnent déjà, je les soupçonne juste de ne pas être bien
agencés/écrits.

KooK


Avatar
ASM

Brrrooufff ! ! rien que çà ?

voir à voir (au moins pour le début de la question)


Je te remercie de ta réponse mais je m'intéresse moins à
l'autocompletion (puisque YUI et scriptaculous s'en charge)


Je m'en doutais un peu ...
néanmoins je trouve le code d'Elegie assez super
avec le grand avantage de ne pas avoir à :
- décortiquer, comprendre une bibli à tout faire
- faire charger la dite bibli pour un truc ou deux
- utiliser à bon et sciant cette bibli

qu'à la structure/ à l'organisation du code.


Pour le reste (champs liés) ... le mystère demeure :-)

Comme je l'ai mentionné, mes codes fonctionnent déjà,


donc tout est bien :-)

je les soupçonne juste de ne pas être bien agencés/écrits.


heu ... là il faut donc bien connaître les biblis mentionnées,
je passe ...


--
Stephane Moriaux et son (moins) vieux Mac déjà dépassé


Avatar
KooK
je les soupçonne juste de ne pas être bien agencés/écrits.


heu ... là il faut donc bien connaître les biblis mentionnées,
je passe ...



Bon, je vais essayer de détailler un pb purement javascript.

j'ai besoin de passer une référence à une fonction qui va recevoir un
argument sQuery. Ce qui donne :

mafonction = function (sQuery)
{ ... }

..blabla...
new Autocomplete(..., mafonction);

Penses-tu qu'il serait possible d'ajouter un argument à cette fonction,
sans pour autant toucher à la classe Autocomplete, pour obtenir qqc du
genre :

mafonctionBis = function (sQuery, qqc)
{ ... }

..blabla...
new Autocomplete(..., mafonctionBis);

Il manque un truc à ce simple ajout puisque à l'execution 'qqc' est vide.

Merci quand même de t'être penché sur mon pb.

KooK