¿Cómo obtengo las coordenadas de píxel (x, y) del recuadro en los cuadros de texto?


Estoy usando jQuery y tratando de encontrar una forma de navegador cruzado para obtener las coordenadas de píxel del cuadro en <textarea> s y input cajas de tal manera que pueda colocar un div absolutamente posicionado alrededor de esta ubicación.

¿Hay algún plugin de jQuery? O fragmento de JavaScript para hacer precisamente eso?

Author: Dan Dascalescu, 2008-08-27

3 answers

He buscado un complemento textarea caret coordinates para meteor-autocomplete, así que he evaluado todos los 8 complementos en GitHub. El ganador es, con mucho, textarea-caret-position de Component .

Características

  • precisión de píxeles
  • ninguna dependencia en absoluto
  • compatibilidad del navegador: Chrome, Safari, Firefox (a pesar de dos bugs que tiene), IE9+; puede funcionar pero no probado en Opera, IE8 o mayor
  • admite cualquier familia de fuentes y tamaño, así como transformaciones de texto
  • el área de texto puede tener relleno arbitrario o bordes
  • no confundidos por barras de desplazamiento horizontales o verticales en el área de texto
  • soporta retornos duros, tabulaciones (excepto en IE) y espacios consecutivos en el texto
  • posición correcta en líneas más largas que las columnas en el área de texto
  • no posición "fantasma" en el espacio vacío al final de una línea al envolver largo palabras

Aquí hay una demostración - http://jsfiddle.net/dandv/aFPA7 /

introduzca la descripción de la imagen aquí

Cómo funciona

Se crea un mirror <div> fuera de la pantalla y se le da el mismo estilo que a <textarea>. Luego, el texto del área de texto hasta el recuadro se copia en el div y se inserta un <span> justo después de él. Luego, el contenido de texto del intervalo se establece en el resto del texto en el área de texto, para reproducir fielmente el envoltorio en el div falso.

Esto es el único método garantizado para manejar todos los casos de borde pertenecientes a la envoltura de líneas largas. También es utilizado por GitHub para determinar la posición de su @ menú desplegable de usuario.

 31
Author: Dan Dascalescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 11:11:14

Nota: esta respuesta describe cómo obtener las coordenadas del carácter del cursor de texto/caret. Para encontrar las coordenadas de píxel, tendrá que ampliar esto aún más.

Lo primero que hay que recordar es que el cursor puede estar en tres estados

  • un cursor de inserción regular en una posición específica
  • una selección de texto que tiene un cierto área acotada
  • no está activo: textarea no tiene foco. No se ha utilizado.

El modelo IE utiliza el Object documento.selection , de esto podemos obtener un objeto TextRange que nos da acceso a la selección y, por lo tanto, a la(s) posición (es) del cursor.

El modelo FF/Opera utiliza las útiles variables [input].selectionStart y selectionEnd.

Ambos modelos representan un cursor ativo regular como una selección de ancho cero, con el límite izquierdo siendo la posición del cursor.

Si el campo de entrada no tiene foco, puede encontrar que ninguno de los dos está establecido. He tenido buen éxito con el siguiente código para insertar un fragmento de texto en la ubicación actual del cursor, también reemplazando la selección actual, si está presente. Dependiendo del navegador exacto, YMMV.

function insertAtCursor(myField, myValue) {

/* selecion model - ie */
if (document.selection) {
  myField.focus();
  sel = document.selection.createRange();
  sel.text = myValue;
}

/* field.selectionstart/end  firefox */ 
else if (myField.selectionStart || myField.selectionStart == '0' ) {

  var startPos = myField.selectionStart;
  var endPos = myField.selectionEnd;
  myField.value = myField.value.substring(0, startPos)
    + myValue
    + myField.value.substring(endPos, myField.value.length);

  myField.selectionStart = startPos + myValue.length;
  myField.selectionEnd = startPos + myValue.length;
  myField.focus();
} 

// cursor not active/present
else {
  myField.value += myValue;
}

Nota de error: los enlaces no están correctamente marcados en el párrafo superior.

Objeto de selección: http://msdn.microsoft.com/en-us/library/ms535869 (VS.85).aspx
Objeto TextRange: http://msdn.microsoft.com/en-us/library/ms535872 (VS.85).aspx

 1
Author: Cheekysoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 12:59:44

No creo que se pueda hacer en todos los navegadores. Alguien lo ha hecho en IE6, pero no funciona en FF u Opera (AFAIK). Tal vez usted puede conseguir que funcione en todos los navegadores.

Aquí hay una entrada de blog de 2005 .

 0
Author: Marius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-17 02:26:32