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

JavaScript Discussion :

Tabulation et input (pas pour TABINDEX)


Sujet :

JavaScript

  1. #1
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par d�faut Tabulation et input (pas pour TABINDEX)
    Bonjour, Je ne trouve pas de solution a mon probleme :
    J'ai une page xhtml avec des input text. Quand j'appuis sur TAB ca passe d'un champ au champ suivant sauf que ca me selectionne tout le texte de mon input.
    Je voudrais que TAB ne me selectionne pas le texte que j'ai dans mon input et que le curseur (clavier) se mette a la fin de mon texte.
    Est ce possible ?

    exemple : j'ai 2 champs; dans le champ1 il y a ecrit "toto" et dans le champ2 il y a ecrit "tutu". Quand je suis dans le champ1 je fait TAB. Je me retrouve dans mon champ2 avec "tutu" selectionner !! si bien que quand j�appuie sur la touche "a" ca m'efface "tutu" et m'ecrit "a" a la place ! Moi je voudrais que quand j'appuie sur "a" ca fasse "tutua".


    j'utilise Chrome (derniere version)

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de RomainVALERI
    Homme Profil pro
    POO�te
    Inscrit en
    Avril 2008
    Messages
    2 652
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : POO�te

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 652
    Par d�faut
    Tu trouveras probablement cette discussion int�ressante
    (si tu n'es pas anglophone ou que tu as du mal � l'adapter chez toi pour une quelconque raison... n'h�site pas ^^)

    Sur FF/Chrome, �a devrait ressembler � quelque chose comme :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    var elem = document.getElementById("elem");
    elem.startSelection = elem.value.length - 1;

  3. #3
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par d�faut
    Merci RomainVALERI, J'ai essay� ta solution dans tous les sens mais ca marche pas ! j'ai vu aussi d'autre facon de le faire mais rien y fait !!
    voila mon code :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <table class="tables">
    <tr>
       <td class="tdlabel" >
          <label for="precision">precision : </label>
       </td>
     
       <td class="tdinput">
          <input type="text" class="saisie" name="precision" id="precision" value="test" autocomplete="off"  onfocus="this.SelectionStart=1;this.SelectionEnd=2; " />
       </td>
    </table>
    donc voila mon input. Il est mis dans une table pour un soucis esth�tique. J'ai voulu pour faire simple selectionner le 2eme caractere de "test" quand le input prend le focus ! mais ca marche pas !!!
    Des id�es ?

  4. #4
    Expert �minent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par d�faut
    Bonjour,

    Tout d'abord il manque un </tr> mais je suppose que c'est simplement un code d'exemple. Ensuite faites attention au nom que vous donnez. Il y a l'input avec l'id precision, ainsi que le label avec le for precision.

  5. #5
    Mod�rateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 224
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 224
    Par d�faut
    Bonjour,
    Citation Envoy� par kwyzix
    Je voudrais que TAB ne me selectionne pas le texte que j'ai dans mon input et que le curseur (clavier) se mette a la fin de mon texte.
    La s�lection du texte, lorsqu'un contr�le prend le focus, est le comportement par d�faut sur tous les navigateurs.

    Citation Envoy� par kwyzix
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ...onfocus="this.SelectionStart=1;this.SelectionEnd=2; " />
    non compatible avec IE < 9 sous sa v�ritable �criture selectionStart et selectionEnd.

    Ceci c'est sans compter l'action par d�faut des navigateurs qui fait que le placement du curseur est annul� par la s�lection par d�faut, ceci n'est bien s�r valable que dans le cas d'une s�lection par d�placement au clavier et non par un click dans la zone, qui d�clenche, au passage, un �v�nement onfocus.

    Il existe , sur la toile, un certains nombre de fonction de placement de curseur mais ne tenant pas compte de cet effet de bord, il est vrai que la demande est singuli�re dans le sens o� tu vas � l'inverse du comportement naturel des navigateurs.

    Je noterai aussi que cette effet ne se produit pas sur des champs de type TEXTAREA.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par d�faut
    Hello !

    Bon ben j'ai essay� toutes sortes de fonction pour tenter de faire ce que je veux mais rien a faire ! rien ne marche !!
    Je ne sais pas si c'est moi qui ai une configuration particuli�re qui fait que ca marche pas ou si c'est pour tout le monde pareil !!?? y en a t'il parmi vous qui sont arriv� a faire ce que je veux ? Pour info mon navigateur est Chrome et c'est pour une appli intranet donc c'est pas grave si ca marche pas sous un autre navigateur ! mais si il faut que je change de navigateur pour arriver a mes fins, c'est possible aussi !
    Merci Vermine et Nosmoking pour vos infos ! une autre petite question pour peut etre comprendre pourquoi ca marche pas : Souvent dans les exemples que je trouve sur la toile pour faire ce que je veux, ils cr�ent un bouton qui va executer la fontion pour mettre le curseur a la fin d'une zone de saisie ! mais je n'en trouve pas qui mettent ca direct dans un onfocus de la saisie en question. Le 'onfocus' de la saisie, se fait elle AVANT l'action par d�faut du navigateur ou APRES ? est si c'est AVANT, comment surcharger l'action par defaut du navigateur ?
    D'avance merci !

  7. #7
    Mod�rateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 224
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 224
    Par d�faut
    Le 'onfocus' de la saisie, se fait elle AVANT l'action par d�faut du navigateur ou APRES ?
    il faut distinguer 2 choses, le focus li� au d�placement par la touche TAB et le focus li� au click via la mouse.
    • Via touche TAB, un seul �v�nement est d�clench�, le onfocus
    • Via la mouse, on a dans l'ordre, onmousedown, onfocus et onclick
    La probl�matique est qu'effectivement lorsque tu affectes une fonction sur l'�v�nement onfocus, il semblerait que celle ci soit prise en compte avant l'action par d�faut.

    Il existe une solution, que j'ai d�j� exp�riment�e, � savoir l'utilisation de setTimeout.

    Il suffit sur l'�v�nement onfocus de mettre un setTimeout porteur de la fonction de positionnement.
    Il y a un effet de bord dans ce cas, si tu acc�des au champ via un click de la mouse la fonction s'ex�cute quand m�me, l'astuce est dans ce cas de couper court au setTimeout.

    Compte tenu de ce que je viens d'�crire, et si l'on veut quand m�me avoir un comportement, presque, normal lorsque l'on clique, il est pr�f�rable d'ajouter une action sur les �v�nements onfocus ET onclick, ce qui je l'admet est difficile � placer dans la balise, et quoiqu'il arrive pas tr�s classe.

    Dans ton cas je pense qu'il est souhaitable, je me trompe s�rement, de traiter tous tes inputs en fin de chargement de la page soit sur le onload du window.

    Pour commencer, la fonction de setCursorPosition, une parmi des 10...
    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
    function setCursorPosition( obj, pos){
      // get l'element
      var oText = (typeof obj === 'object') ? obj : document.getElementById(obj);
      // position curseur end si pas d'info
      pos = pos || oText.value.length || 0;
      // si existe
      if( oText){
        // mise du focus
        oText.focus();
        // en direct si supporte
        if( typeof oText.selectionStart != "undefined"){
          oText.setSelectionRange( pos, pos);
        }
        // IE and consort
        else{
          // create range
          var oRange = oText.createTextRange();
          // deplacement curseur
          oRange.move('character', pos);
          // select this
          oRange.select();
        }
      }
    }
    c'est une classique avec des variantes d'�criture et de prise en compte des actions par d�faut...

    Maintenant il suffit de traiter les INPUT concern�s sur le onload, par exemple
    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
    window.onload = function(){
      // get parent
      var oMain = document.getElementById('div_main');
      //---------
      if( oMain){
        var i, nb, oCtr, oInput = oMain.getElementsByTagName('input');
        for( i = 0, nb = oInput.length; i < nb; i++){
          oCtr = oInput[i];
          // affectation du setTimeout sur onfocus
          oCtr.onfocus = (function(obj) {
              return function(){
                obj.iTimer = setTimeout( function(){
                  setCursorPosition( obj, obj.value.length); // obj.value.length facultatif
                },
                200); // attention ne pas mettre trop court
              };
            }
          )(oCtr);
          // affectation du clearTimeout sur onclik
          oCtr.onclick = function(){
            clearTimeout( this.iTimer);
          };
        }
      }
    };
    il serait plus mieux de mettre en addEvent, mais bon...

    J'esp�re avoir r�pondu le plus clairement possible, je cours prendre une aspirine.

  8. #8
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par d�faut
    YEEEESSSS !! Super ca marche nickel !! Merci NoSmoking !
    C'est une solution un peu bidouille mais ca marche !
    Si un de ces 4 tu vois une meilleur solution (moins bidouille) je suis preneur

    Merci encore !! ca faisait un semaine que je galerais avec ce truc ^^

  9. #9
    Mod�rateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 224
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 224
    Par d�faut
    YEEEESSSS !! Super ca marche nickel !! Merci NoSmoking !
    je devais avoir la t�te dans le sceau quand je t'ai propos� cela.
    Je m'explique
    ...dans l'ordre d'apparition des �v�nements on trouve mouseover, focus etc...
    il est donc stupide de faire un clearTimeout sur le click, autant bloquer l'action sur le onmousedown, en plus l'effet � l'�cran devrait �tre plus fluide et moins capricieux en cas de click prolong�.

    Cela donne la fonction sur le onload, l�g�rement chang�e, suivante
    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
    window.onload =  function(){
      // get parent
      var oMain = document.getElementById('div_main');
      //---------
      if( oMain){
        var i, nb, oCtr, oInput = oMain.getElementsByTagName('input');
        for( i = 0, nb = oInput.length; i < nb; i++){
          oCtr = oInput[i];
     
          oCtr.onmousedown = function(){
            this.bFlag = true;
          };
     
          oCtr.onfocus = (function(obj) {
            return function(){
              if( !obj.bFlag){
                setTimeout( function(){
                  setCursorPosition( obj, obj.value.length);},
                1); // 1 est suffisant pour retarder l'appel de la  fonction
              }
              obj.bFlag = false;
            };
          })(oCtr);
        }
      }
    };
    C'est une solution un peu bidouille mais ca marche !
    Si un de ces 4 tu vois une meilleur solution (moins bidouille) je suis preneur
    je ne vois aucune bidouille l� dedans, tout au plus un am�nagement du comportement par d�faut des navigateurs.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2011
    Messages
    16
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 16
    Par d�faut
    Oui bon ok c'est pas de la bidouille mais ca aurait �t� bien un truc du genre :
    Code html : S�lectionner tout - Visualiser dans une fen�tre � part
    <input type="text" value="bonjour" onfocus="setCursorPosition( -1 )">
    et hop ca marche ^^ !!
    Mais ta solution marche alors je me plaint pas et te remercie encore !!
    Par contre comment je fait si je ne veux s�lectionner que les "input" de type text ou int au lieu de tout les "input" dans ta fonction ? car la fonction me fait quelques problemes avec les "button" ( je pense que le setimeout() n'est pas pr�vu pour les "button") !!

  11. #11
    Mod�rateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17 224
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Is�re (Rh�ne Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17 224
    Par d�faut
    Oui bon ok c'est pas de la bidouille mais ca aurait �t� bien un truc du genre :
    <input type="text" value="bonjour" onfocus="setCursorPosition( -1 )">
    et hop ca marche ^^ !!
    il est moins propre d'�crire cela que ce que je t'ai mis, s�paration du javascript du HTML.

    N�anmoins tu peux toujours cr�er une fonction tampon, par exemple setCursorEnd, qui elle se charge du d'appeler setCursorPosition via setTimeout.

    Par contre comment je fait si je ne veux s�lectionner que les "input" de type text ou int au lieu de tout les "input" dans ta fonction ?
    dans la fonction qui se trouve sur le onload tu testes le type d'input, si c'est un type text tu appliques sinon tu passes ton chemin.

    ...car la fonction me fait quelques problemes avec les "button" ( je pense que le setimeout() n'est pas pr�vu pour les "button") !!
    la fonction n'est pas appel�e sur les button, car on ne r�cup�re que les INPUT.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 6
    Dernier message: 21/06/2012, 11h57
  2. Curseur ne s'affiche pas pour input
    Par taroudant dans le forum Mise en page CSS
    R�ponses: 5
    Dernier message: 02/07/2008, 08h23
  3. [Performance] - Blob ou pas pour les images d'un site ?
    Par ShinJava dans le forum SQL Proc�dural
    R�ponses: 2
    Dernier message: 04/07/2005, 17h32
  4. DISTINCT ne fonctionne pas pour 1 seul champs dans le SELECT
    Par systemf dans le forum Requ�tes
    R�ponses: 13
    Dernier message: 20/07/2004, 08h54

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