2011-10-12 10 views
49

Ho una textarea e vorrei sapere se sono sull'ultima riga nella textarea o sulla prima riga nella textarea con il mio cursore con javascript.Come si ottiene la posizione del cursore in un'area di testo?

Ho pensato di afferrare la posizione del primo carattere di nuova riga e l'ultimo carattere di nuova riga e quindi afferrare la posizione del cursore.

var firstNewline = $('#myTextarea').val().indexOf('\n'); 
var lastNewline = $('#myTextarea').val().lastIndexOf('\n'); 

var cursorPosition = ?????; 

if (cursorPosition < firstNewline) 
    // I am on first line. 
else if (cursorPosition > lastNewline) 
    // I am on last line. 
  • E 'possibile per afferrare la posizione del cursore all'interno del textarea?
  • Hai un suggerimento migliore per scoprire se sono sulla prima o sull'ultima riga di una textarea?

jQuery soluzioni preferite a meno che javascript sia semplice o più semplice.

Qualsiasi aiuto è molto apprezzato.

+0

Hai visto la soluzione qui: http://blog.vishalon.net/index .php/javascript-getting-and-setting-caret-position-in-textarea/ –

+0

Questo genera un errore, poiché le funzioni 'indexOf' e lastIndexOf' non sono metodi della funzione val'. Dovresti usare questo (anche se non dovresti usare affatto quel codice): 'var firstNewline = String ($ (" # myTextarea "). Val()). IndexOf ('\ n');' – TricksfortheWeb

risposta

60

Se non è presente alcuna selezione, è possibile utilizzare le proprietà .selectionStart o .selectionEnd (senza selezione sono uguali).

var cursorPosition = $('#myTextarea').prop("selectionStart"); 

Si noti che questo non è supportato nei browser più vecchi, in particolare IE8-. Dovrai lavorare con intervalli di testo, ma è una completa frustrazione.

Credo ci sia una libreria da qualche parte che è dedicata a ottenere e impostare le selezioni/posizioni del cursore in elementi di input, però. Non riesco a ricordare il suo nome, ma sembra che ci siano dozzine di articoli su questo argomento.

+0

Dang. C'è un modo per farlo funzionare in IE8? Grazie per la soluzione. – Chev

+0

@Alex Ford: ora vedo che gli è stata data risposta in effetti: http://stackoverflow.com/questions/2897155/get-caret-position-within-an-text-input-field. – pimvdb

+0

Sei corretto. Ho usato il plugin jQuery che un rispondente ha dato sulla domanda che hai collegato. Questo è stato. Ci scusiamo per il duplicato. – Chev

16

Ecco una funzione cross browser che ho nella mia libreria standard:

function getCursorPos(input) { 
    if ("selectionStart" in input && document.activeElement == input) { 
     return { 
      start: input.selectionStart, 
      end: input.selectionEnd 
     }; 
    } 
    else if (input.createTextRange) { 
     var sel = document.selection.createRange(); 
     if (sel.parentElement() === input) { 
      var rng = input.createTextRange(); 
      rng.moveToBookmark(sel.getBookmark()); 
      for (var len = 0; 
        rng.compareEndPoints("EndToStart", rng) > 0; 
        rng.moveEnd("character", -1)) { 
       len++; 
      } 
      rng.setEndPoint("StartToStart", input.createTextRange()); 
      for (var pos = { start: 0, end: len }; 
        rng.compareEndPoints("EndToStart", rng) > 0; 
        rng.moveEnd("character", -1)) { 
       pos.start++; 
       pos.end++; 
      } 
      return pos; 
     } 
    } 
    return -1; 
} 

utilizzare nel proprio codice come questo:

var cursorPosition = getCursorPos($('#myTextarea')[0]) 

Ecco la sua funzione complementare:

function setCursorPos(input, start, end) { 
    if (arguments.length < 3) end = start; 
    if ("selectionStart" in input) { 
     setTimeout(function() { 
      input.selectionStart = start; 
      input.selectionEnd = end; 
     }, 1); 
    } 
    else if (input.createTextRange) { 
     var rng = input.createTextRange(); 
     rng.moveStart("character", start); 
     rng.collapse(); 
     rng.moveEnd("character", end - start); 
     rng.select(); 
    } 
} 

http://jsfiddle.net/gilly3/6SUN8/

+0

Non funziona con interruzioni di riga iniziali/finali in IE <9. –

+0

@TimDown - Avete ragione. Mi rendo conto ora che la versione che ho incollato qui, usavo per i controlli '' esclusivamente. Ho modificato la mia risposta per utilizzare una versione che funziona anche per i comandi '