Estoy encontrando toneladas de buenas respuestas de navegadores cruzados sobre cómo CONFIGURAR el cursor o la posición del índice de intercalación en un contentEditable
elemento, pero ninguna sobre cómo OBTENER o encontrar su índice ...
Lo que quiero hacer es conocer el índice del signo de intercalación dentro de este div, en keyup
.
Entonces, cuando el usuario está escribiendo texto, puedo saber en cualquier momento el índice de su cursor dentro del contentEditable
elemento.
EDITAR: Estoy buscando el ÍNDICE dentro del contenido div (texto), no las coordenadas del cursor.
<div id="contentBox" contentEditable="true"></div>
$('#contentbox').keyup(function() {
// ... ?
});
<a>
elemento dentro de<div>
, ¿qué compensación desea entonces? ¿El desplazamiento dentro del texto dentro de<a>
?Respuestas:
El siguiente código asume:
<div>
y ningún otro nodowhite-space
propiedad CSS establecida enpre
Si necesita un enfoque más general que funcione con contenido con elementos anidados, pruebe esta respuesta:
https://stackoverflow.com/a/4812022/96100
Código:
fuente
<a>
elemento dentro de<div>
, ¿qué compensación desea entonces? ¿El desplazamiento dentro del texto dentro de<a>
?keyup
es probable que sea el evento incorrecto para esto, pero es lo que se usó en la pregunta original.getCaretPosition()
en sí mismo está bien dentro de sus propias limitaciones.<br>
o<div>
, que viola el primer supuesto mencionado en la respuesta. Si necesita una solución un poco más general, puede probar stackoverflow.com/a/4812022/96100Algunas arrugas que no veo que se aborden en otras respuestas:
Esta es una forma de obtener las posiciones inicial y final como compensaciones del valor textContent del elemento:
fuente
fuente
Prueba esto:
Caret.js Obtener la posición de intercalación y el desplazamiento del campo de texto
https://github.com/ichord/Caret.js
demostración: http://ichord.github.com/Caret.js
fuente
contenteditable
li
cuando se hacía clic en un botón para cambiarli
el nombre del contenido.Un poco tarde para la fiesta, pero en caso de que alguien más tenga problemas. Ninguna de las búsquedas de Google que he encontrado durante los últimos dos días ha dado con algo que funcione, pero se me ocurrió una solución concisa y elegante que siempre funcionará sin importar cuántas etiquetas anidadas tenga:
Selecciona todo el camino hasta el principio del párrafo y luego cuenta la longitud de la cadena para obtener la posición actual y luego deshace la selección para devolver el cursor a la posición actual. Si desea hacer esto para un documento completo (más de un párrafo), cambie
paragraphboundary
adocumentboundary
o cualquier granularidad para su caso. Consulte la API para obtener más detalles . ¡Salud! :)fuente
<div contenteditable> some text here <i>italic text here</i> some other text here <b>bold text here</b> end of text </div>
Cada vez que coloco el cursor antes de lai
etiqueta o cualquier elemento html secundario dentrodiv
, la posición del cursor comienza en 0. ¿Hay alguna manera de escapar de este recuento de reinicios?fuente
Esta funciona para mí:
La línea de llamada depende del tipo de evento, para evento clave use esto:
para el evento del mouse use esto:
en estos dos casos me ocupo de las líneas de ruptura agregando el índice de destino
fuente
Nota: el objeto de rango en sí mismo se puede almacenar en una variable y se puede volver a seleccionar en cualquier momento a menos que cambie el contenido del div contenteditable.
Referencia para IE 8 y versiones anteriores: http://msdn.microsoft.com/en-us/library/ms535872(VS.85).aspx
Referencia para navegadores estándares (todos los demás): https://developer.mozilla.org/en/DOM/range (son los documentos de mozilla, pero el código funciona en Chrome, Safari, Opera e ie9 también)
fuente
Range
objeto devuelto por la mayoría de los navegadores y elTextRange
objeto devuelto por IE son cosas extremadamente diferentes, por lo que no estoy seguro de que esta respuesta resuelva mucho.Como esto me tomó una eternidad averiguar el uso de la nueva API window.getSelection que voy a compartir para la posteridad. Tenga en cuenta que MDN sugiere que hay un soporte más amplio para window.getSelection, sin embargo, su millaje puede variar.
Aquí hay un jsfiddle que se dispara al activar el teclado. Sin embargo, tenga en cuenta que las pulsaciones rápidas de las teclas de dirección, así como la eliminación rápida, parecen ser eventos de omisión.
fuente
Una forma sencilla, que itera a través de todos los niños del div contenteditable hasta que llega al endContainer. Luego agrego el desplazamiento del contenedor final y tenemos el índice de caracteres. Debería funcionar con cualquier número de nidos. utiliza la recursividad.
Nota: requiere un relleno de polietileno para que, por ejemplo, soporte
Element.closest('div[contenteditable]')
https://codepen.io/alockwood05/pen/vMpdmZ
fuente