2009-12-11 6 views
54

Comment puis-je obtenir la position du curseur dans une zone de texte à l'aide de jQuery? Je cherche le décalage du curseur depuis le début du texte, pas pour the (x, y) position.Position du curseur dans une zone de texte (index de caractères, pas de coordonnées x/y)

+0

Avez-vous besoin de savoir combien de caractères sont dans la zone ou lorsque le curseur se trouve dans un corps de texte? Le premier est possible, le dernier n'est (probablement) pas. – Jason

+0

où le curseur est dans le texte – kmunky

Répondre

8

Pas jQuery, mais juste Javascript ...

var position = window.getSelection().getRangeAt(0).startOffset; 
+1

hmm ... ça ne marche pas (FF), je reçois juste 0 peu importe ce – kmunky

+1

en chrome ça ne marche pas, trop –

+0

fonctionne pour moi en chrome – Adam

13

function caretPos(el) 
{ 
    var pos = 0; 
    // IE Support 
    if (document.selection) 
    { 
     el.focus(); 
     var Sel = document.selection.createRange(); 
     var SelLength = document.selection.createRange().text.length; 
     Sel.moveStart ('character', -el.value.length); 
     pos = Sel.text.length - SelLength; 
    } 
    // Firefox support 
    else if (el.selectionStart || el.selectionStart == '0') 
     pos = el.selectionStart; 

    return pos; 

} 
+0

j'ai essayé votre fonction en FF et cela ne fonctionne pas, wach temps peu importe ce que je reçois 0 – kmunky

+0

également dans le plus récent chrome, il revient toujours 0 –

85

solution modifiée de Bojang travailler avec jQuery. Testé dans Chrome, FF et IE.

(function ($, undefined) { 
    $.fn.getCursorPosition = function() { 
     var el = $(this).get(0); 
     var pos = 0; 
     if('selectionStart' in el) { 
      pos = el.selectionStart; 
     } else if('selection' in document) { 
      el.focus(); 
      var Sel = document.selection.createRange(); 
      var SelLength = document.selection.createRange().text.length; 
      Sel.moveStart('character', -el.value.length); 
      pos = Sel.text.length - SelLength; 
     } 
     return pos; 
    } 
})(jQuery); 

Fondamentalement, pour l'utiliser sur une zone de texte, procédez comme suit:

$("#myTextBoxSelector").getCursorPosition(); 
+1

Entrez un texte dans une entrée. Commencez à appuyer sur la flèche gauche, je reçois '1' lorsque le curseur est avant le premier caractère. Si j'appuie de nouveau à gauche, j'obtiens un '0' mais le curseur reste là (à l'extrême gauche de l'élément d'entrée). Mind quelqu'un explique ce comportement? – Odys

+0

en appuyant sur retour arrière, le nombre augmente. ça devrait diminuer. –

+0

ça marche !!! merci –

5

Cela fonctionne aussi dans IE9, Firefox et Chrome:

(function ($, undefined) { 
    $.fn.getCursorPosition = function() { 
     var el = $(this).get(0); 
     var pos = 0; 
     if('selectionStart' in el) { 
      pos = el.selectionStart; 
     } else if('selection' in document) { 
      el.focus(); 
      var Sel = document.selection.createRange(); 
      var SelLength = document.selection.createRange().text.length; 
      Sel.moveStart('character', -el.value.length); 
      pos = Sel.text.length - SelLength; 
     } 
     return pos; 
    } 
})(jQuery); 

Et je pense qu'il est beaucoup plus propre alors la version de Ryan

+0

Quel est le but du paramètre 'undefined' dans ce code? – StriplingWarrior

+1

dans ce morceau de code, il n'a pas de but. Mais en général, c'est ainsi que vous réinitialisez undefined à undefined. C'est fou mais dans ECMAScript3 la variable "undefined" peut être réaffectée à une autre valeur. Donc, si votre code repose sur undefined pour être indéfini, vous devriez réinitialiser la variable à undefined. Le chemin ci-dessus est la meilleure pratique pour le faire. –

+0

@MaximilianRuta Pourquoi avez-vous inséré votre code dans la réponse de quelqu'un d'autre? – maialithar

11

J'ai fait un peu de travail en utilisant ce jQuery masked input plug et j'ai trouvé la fonction caret tion vraiment utile. J'ai extrait ce code du plugin ci-dessus ..

$.fn.caret = function (begin, end) 
    { 
     if (this.length == 0) return; 
     if (typeof begin == 'number') 
     { 
      end = (typeof end == 'number') ? end : begin; 
      return this.each(function() 
      { 
       if (this.setSelectionRange) 
       { 
        this.setSelectionRange(begin, end); 
       } else if (this.createTextRange) 
       { 
        var range = this.createTextRange(); 
        range.collapse(true); 
        range.moveEnd('character', end); 
        range.moveStart('character', begin); 
        try { range.select(); } catch (ex) { } 
       } 
      }); 
     } else 
     { 
      if (this[0].setSelectionRange) 
      { 
       begin = this[0].selectionStart; 
       end = this[0].selectionEnd; 
      } else if (document.selection && document.selection.createRange) 
      { 
       var range = document.selection.createRange(); 
       begin = 0 - range.duplicate().moveStart('character', -100000); 
       end = begin + range.text.length; 
      } 
      return { begin: begin, end: end }; 
     } 
    } 

Une fois que vous avez créé la fonction, vous pouvez effectuer les opérations suivantes. Encore une fois, cette fonction a été tirée de la fonction d'entrée masquée jQuery mentionnée ci-dessus.

$("#id").caret(); //get the begin/end caret position 
$("#id").caret().begin; 
$("#id").caret().end; 
$("#otherId").caret(5); //set the caret position by index 
$("#otherId").caret(1, 5); //select a range 
2
function doGetCaretPosition(ctrl) { 
    var CaretPos = 0; // IE Support 
    if (document.selection) { 
     ctrl.focus(); 
     var Sel = document.selection.createRange(); 
     Sel.moveStart('character', -ctrl.value.length); 
     CaretPos = Sel.text.length; 
    } 
    // Firefox support 
    else if (ctrl.selectionStart || ctrl.selectionStart == '0') 
     CaretPos = ctrl.selectionStart; 
    return (CaretPos); 
} 
Questions connexes