Ottieni la posizione del cursore (in caratteri) all'interno di un campo di immissione testo


212

Come posso ottenere la posizione del cursore all'interno di un campo di input?

Ho trovato alcuni frammenti tramite Google, ma niente a prova di proiettile.

Fondamentalmente qualcosa come un plugin jQuery sarebbe l'ideale, quindi potrei semplicemente farlo

$("#myinput").caretPosition()

2
Prova a cercare la "posizione del cursore", che ti darà molti più successi, così come alcuni argomenti al riguardo su SO.
Alec,


2
@CMS Trovare la posizione in un <input>modo è molto più semplice che farlo in un <textarea>.
Andrew Mao,

1
@AndrewMao: e molto più difficile se il testo viene fatto scorrere e il cursore è passato dai sizecaratteri.
Dan Dascalescu il

@alec: sono d'accordo che la ricerca del cursore anziché del cursore può produrre più risultati. Come indicato altrove, ho appreso che la cura è il termine più appropriato. Un cursore rappresenta una posizione in qualsiasi cosa mentre un cursore rappresenta una posizione specificamente nel testo.
Suncat2000,

Risposte:


247

Aggiornamento più semplice:

Usa l' field.selectionStart esempio in questa risposta .

Grazie a @commonSenseCode per averlo segnalato.


Vecchia risposta:

Ho trovato questa soluzione. Non basato su jquery ma non ci sono problemi per integrarlo con jquery:

/*
** Returns the caret (cursor) position of the specified text field (oField).
** Return value range is 0-oField.value.length.
*/
function doGetCaretPosition (oField) {

  // Initialize
  var iCaretPos = 0;

  // IE Support
  if (document.selection) {

    // Set focus on the element
    oField.focus();

    // To get cursor position, get empty selection range
    var oSel = document.selection.createRange();

    // Move selection start to 0 position
    oSel.moveStart('character', -oField.value.length);

    // The caret position is selection length
    iCaretPos = oSel.text.length;
  }

  // Firefox support
  else if (oField.selectionStart || oField.selectionStart == '0')
    iCaretPos = oField.selectionDirection=='backward' ? oField.selectionStart : oField.selectionEnd;

  // Return results
  return iCaretPos;
}

9
else if (oField.selectionStart || oField.selectionStart == '0')potrebbe essereelse if (typeof oField.selectionStart==='number')
user2428118,

Qual è l'idea di "oField.focus ()"? Funziona per me senza questa linea. Fare attenzione se si utilizza l'evento sfocatura sull'input ed eseguire quella funzione all'interno di una richiamata.
Kirill Reznikov,

Lo stai testando su IE? Tutto questo se la sezione viene eseguita solo su IE. In IE esiste solo una selezione globale, ecco perché lo è document.selection, no field.selectiono qualcosa del genere. Inoltre, in IE 7 (non so se è ancora possibile in 8+) è stato possibile selezionare qualcosa, quindi TAB fuori dal campo senza perdere la selezione. In questo modo, quando il testo è selezionato ma il campo non è focalizzato, document.selectionrestituisce la selezione zero. Ecco perché, come soluzione alternativa per questo bug, devi concentrarti sull'elemento prima di leggere il file document.selection.
Bezmax,

sempre 0 per Chrome e Firefox
Kaushik Thanki,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.