example ejemplos javascript jquery html

javascript - ejemplos - Obtener la posición del cursor(en caracteres) dentro de un campo de entrada de texto



jquery selector (8)

¿Cómo puedo obtener la posición de intercalación desde dentro de un campo de entrada?

He encontrado algunas partes y piezas a través de Google, pero nada a prueba de balas.

Básicamente, algo así como un plugin jQuery sería ideal, así que simplemente podría hacer

$("#myinput").caretPosition()


MUY FÁCIL

Respuesta actualizada

Simplemente use selectionStart , es compatible con todos los principales navegadores .

document.getElementById(''foobar'').addEventListener(''keyup'', e => { console.log(''Caret at: '', e.target.selectionStart) })

<input id="foobar" />


Agradable, muchas gracias a Max.

Envolví la funcionalidad de su respuesta en jQuery si alguien quiere usarla.

(function($) { $.fn.getCursorPosition = function() { var input = this.get(0); if (!input) return; // No (input) element found if (''selectionStart'' in input) { // Standard-compliant browsers return input.selectionStart; } else if (document.selection) { // IE input.focus(); var sel = document.selection.createRange(); var selLen = document.selection.createRange().text.length; sel.moveStart(''character'', -input.value.length); return sel.text.length - selLen; } } })(jQuery);


Ahora hay un buen complemento para esto: el complemento Caret

Luego puede obtener el puesto usando $("#myTextBox").caret() o configurarlo a través de $("#myTextBox").caret(position)


Aquí se publican algunas buenas respuestas, pero creo que puede simplificar su código y omitir la comprobación del soporte de inputElement.selectionStart : no solo es compatible con IE8 y versiones anteriores (consulte la documentation ), que representa menos del 1% del navegador actual. uso .

var input = document.getElementById(''myinput''); // or $(''#myinput'')[0] var caretPos = input.selectionStart; // and if you want to know if there is a selection or not inside your input: if (input.selectionStart != input.selectionEnd) { var selectionValue = input.value.substring(input.selectionStart, input.selectionEnd); }


Quizás necesite un rango seleccionado además de la posición del cursor. Aquí hay una función simple, ni siquiera necesita jQuery:

function caretPosition(input) { var start = input[0].selectionStart, end = input[0].selectionEnd, diff = end - start; if (start >= 0 && start == end) { // do cursor position actions, example: console.log(''Cursor Position: '' + start); } else if (start >= 0) { // do ranged select actions, example: console.log(''Cursor Position: '' + start + '' to '' + end + '' ('' + diff + '' selected chars)''); } }

Digamos que quieres llamarlo a una entrada cada vez que cambia o el mouse mueve la posición del cursor (en este caso estamos usando jQuery .on() ). Por motivos de rendimiento, puede ser una buena idea agregar setTimeout() o algo así como Underscores _debounce() si los eventos se están vertiendo:

$(''input[type="text"]'').on(''keyup mouseup mouseleave'', function() { caretPosition($(this)); });

Aquí hay un violín si quieres probarlo: https://jsfiddle.net/Dhaupin/91189tq7/


Tengo una solución muy simple . Pruebe el siguiente código con resultado verificado -

<html> <head> <script> function f1(el) { var val = el.value; alert(val.slice(0, el.selectionStart).length); } </script> </head> <body> <input type=text id=t1 value=abcd> <button onclick="f1(document.getElementById(''t1''))">check position</button> </body> </html>

Te estoy dando el fiddle_demo


Actualización más fácil:

Use field.selectionStart example en esta respuesta .

Gracias a @commonSenseCode por señalar esto.

Respuesta anterior:

Encontré esta solución. No está basado en jquery, pero no hay problema para integrarlo en jquery:

/* ** Returns the caret (cursor) position of the specified text field. ** 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.selectionStart; // Return results return iCaretPos; }


(function($) { $.fn.getCursorPosition = function() { var input = this.get(0); if (!input) return; // No (input) element found if (document.selection) { // IE input.focus(); } return ''selectionStart'' in input ? input.selectionStart:'''' || Math.abs(document.selection.createRange().moveStart(''character'', -input.value.length)); } })(jQuery);