IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques & Frameworks Discussion :

Retarder liste auto-complétion après plusieurs caractères entrés


Sujet :

Bibliothèques & Frameworks

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut Retarder liste auto-complétion après plusieurs caractères entrés
    Bonjour à tous,

    j'utilise Zend_Dojo essentiellement pour l'autocomplétion (avec FilteringSelect). Ca fonctionnait assez bien jusqu'à maintenant, cependant j'aimerais que l'autocomplétion commence à partir de 4 caractères entrés dans le champs (pour éviter d'avoir trop de données affichées et de nuire à l'ergonomie...)

    Je n'ai rien trouvé à ce sujet et j'espérais que certains d'entre vous auraient une solution à cela (je pensais qu'une propriété native existait pour gérer cela mais ce n'est apparemment pas le cas) ?

    On peut détecter facilement quand le champs contient au moins 4 caractères, cependant je ne vois pas comment empêcher l'envoi de données au serveur lorsque mon contenu contient mois de 4 caractères...

    Autre chose concernant l'autocomplétion, est-il possible que la recherche s'effectue sur l'entièreté des valeurs et non plus sur uniquement le début ?

    Même si ici, je développe avec Zend Framework, la solution est liées au framework Javascript Dojo...

    Merci d'avance,

    auré

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Citation Envoyé par aure298 Voir le message
    Bonjour à tous,

    j'utilise Zend_Dojo essentiellement pour l'autocomplétion (avec FilteringSelect). Ca fonctionnait assez bien jusqu'à maintenant, cependant j'aimerais que l'autocomplétion commence à partir de 4 caractères entrés dans le champs (pour éviter d'avoir trop de données affichées et de nuire à l'ergonomie...)

    Je n'ai rien trouvé à ce sujet et j'espérais que certains d'entre vous auraient une solution à cela (je pensais qu'une propriété native existait pour gérer cela mais ce n'est apparemment pas le cas) ?

    On peut détecter facilement quand le champs contient au moins 4 caractères, cependant je ne vois pas comment empêcher l'envoi de données au serveur lorsque mon contenu contient mois de 4 caractères...
    Impossible en l'état: il n'existe que la propriété searchDelay pour changer ce type de paramètre. Sinon il faut changer le code de dojo (fonction _startSearchFromInput de la classe dijit.form.ComboBoxMixin)

    Autre chose concernant l'autocomplétion, est-il possible que la recherche s'effectue sur l'entièreté des valeurs et non plus sur uniquement le début ?
    C'est faisable: queryExpr doit prendre la valeur ${0}

    ERE

  3. #3
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,

    Le code pour commencer la recherche à partir du 4e caractère saisi (c'est du vite fait, rapidement testé, donc à retester). Et surtout cela ne veut pas dire que si tu changes de version dans le futur cela continue à fonctionner (c'est une fonction "privée"); il faut appliquer cette fonction à chaque filteringselect concerné. On pourrait faire un dojo.extend mais ce serait un peu dangereux pour les autres filtering select qui souhaiteraient se comporter "normalement":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    dojo.mixin(dijit.byId("ID_FILTERING_SELECT"), 		
            {_startSearchFromInput: 
                function(){
                 if (this.focusNode.value.length>=4) {
    		         this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1"));
                 } else {
                   this._startSearch("XKPZTR");
                 }
               }
    	});
    Le else sert juste pour forcer dojo à ne trouver aucune entrée et refermer la liste dans le cas ou elle s'était ouverte sur le 4e caractère et qu'on revient à 3 caractères.

    Bon dev,

    ERE

  4. #4
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 70
    Par défaut
    Merci ERE.

    J'ai finalement fait ceci pour le filtrage après 4 caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    dojo.addOnLoad(
                function()
                {
                    dijit.byId('searchPlans').attr('searchAttr', null);
                    canSearch = false;
                    dijit.byId('searchPlans').autoComplete = false;
                    dojo.connect(dojo.byId('searchPlans'), 'onkeyup', myAutocomplete);
                }
                );
    function myAutocomplete()
                {
                    if(dojo.byId('searchPlans').value.length > 3 && canSearch == false)
                    {
                        //start autocomplete
                        //alert(dijit.byId('searchPlans').autoComplete);
                        //alert(dijit.byId('searchPlans').attr('store'));
                        dijit.byId('searchPlans').attr('searchAttr', 'my_field'); //champs sur lequel s'effectue la recheche
                        canSearch = true;
                        console.info('OK - ' + canSearch);
                    }
                    else if(dojo.byId('searchPlans').value.length == 3 && canSearch == true)
                    {
                        //stop autocomplete
                        dijit.byId('searchPlans').attr('searchAttr', null);
                        canSearch = false;
                        console.info('KO - ' + canSearch);
                    }
                }
    En fait je modifie la valeur de recherche en fonction du nombre de caractères entrés.

    Ce n'est malheureusement pas aussi fluide que je ne le voudrais, dû au très grand nombre de données à filtrer(+- 25000 entrées):/. En sachant que j'utilise un objet ItemFileReadStore, je me demandais s'il existait une classe plus appropriée pour gérer ce nombre important de données ?

    Concernant le queryExpr, j'ai dû utiliser la valeur '*${0}*'. En me donnant la propriété à utiliser, je n'avais plus qu'à trouver la valeur qui me convenait. Le problème que je rencontre cette fois se situe au niveau des caractères accentués qui ne s'affichent pas alors que je n'avais aucun problème lorsque je n'utilisais pas queryExpr

    Merci,

    auré

  5. #5
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Re,

    Concernant les caractères accentués, c'est une remarque déjà faite mais je n'ai jamais eu le temps d'investiguer (je crois que c'est du au mode de recherche appliqué, à base de regexp)
    Concernant la rapidité, n'oublions pas que c'est du web, pas une base de données avec des index, et que faire une recherche sur 25000 entrées avec pour chacune l'évaluation d'une regepx est consommateur. C'est incontournable dans ce mode de fonctionnement. L'idéal serait d'interroger le server plus régulièrement mais alors on perdrait du temps entre les aller-retours Il n'existe à l'heure actuelle aucune solution miracle, même si je crois que l'écriture d'un store, réduit à un simple tableau de données et sans vérifications superflues, trié, serait un beau gain de perf.

    Enfin, pour la pose de l'événement connect il ne faut pas oublier que rien ne dit dans la doc que ta fonction myAutoComplete sera appelée avant ou après le traitement onkeyup original... C'est même plutôt indiqué qu'il ne faut surtout pas compter la dessus. A consommer avec modération.

    Bon dev,
    ERE

Discussions similaires

  1. Définir le style de la liste d'auto-complétion d'une ComboBox
    Par obitskater dans le forum Windows Forms
    Réponses: 0
    Dernier message: 03/09/2010, 17h14
  2. Réponses: 0
    Dernier message: 04/02/2009, 12h36
  3. "Éditer une liste" pour l'auto-complétion
    Par pepelele dans le forum Eclipse
    Réponses: 0
    Dernier message: 07/03/2008, 16h14
  4. Réponses: 1
    Dernier message: 01/11/2006, 19h20
  5. Saisie de plusieurs caractère dans une liste déroulante
    Par Oluha dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/03/2005, 14h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo