Tengo este HTML simple como ejemplo:
<div id="editable" contenteditable="true">
text text text<br>
text text text<br>
text text text<br>
</div>
<button id="button">focus</button>
Quiero algo simple: cuando hago clic en el botón, quiero colocar el cursor (cursor) en un lugar específico en el div editable. Al buscar en la web, tengo este JS adjunto al clic del botón, pero no funciona (FF, Chrome):
var range = document.createRange();
var myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);
¿Es posible establecer manualmente la posición del cursor de esta manera?
setSelectionRange()
función de la respuesta que escribí aquí: stackoverflow.com/questions/6240139/… . Como señalé en la respuesta, hay varias cosas que no manejará de manera correcta / consistente, pero puede ser lo suficientemente bueno.document.createRange
(owindow.getSelection
, pero no llegará tan lejos).La mayoría de las respuestas que encuentra en el posicionamiento de cursor contento son bastante simplistas, ya que solo atienden entradas con texto simple. Una vez que usa elementos html dentro del contenedor, el texto ingresado se divide en nodos y se distribuye generosamente en una estructura de árbol.
Para establecer la posición del cursor, tengo esta función que recorre todos los nodos de texto secundarios dentro del nodo suministrado y establece un rango desde el inicio del nodo inicial hasta el carácter chars.count :
Luego llamo a la rutina con esta función:
Range.collapse (false) establece el cursor al final del rango. Lo probé con las últimas versiones de Chrome, IE, Mozilla y Opera y todas funcionan bien.
PD. Si alguien está interesado, obtengo la posición actual del cursor usando este código:
El código hace lo contrario de la función set: obtiene la ventana actual.getSelection (). FocusNode y focusOffset y cuenta hacia atrás todos los caracteres de texto encontrados hasta que llega a un nodo padre con la identificación de containerId. La función isChildOf solo comprueba antes de ejecutar que el nodo suministrado es realmente hijo del parentId proporcionado .
El código debería funcionar directamente sin cambios, pero lo acabo de tomar de un complemento jQuery que he desarrollado, así que he pirateado algunos de estos, ¡ avíseme si algo no funciona!
fuente
node.id
y meparentId
relaciono sin un ejemplo. Gracias :)Si no desea usar jQuery, puede probar este enfoque:
editableDiv
tu elemento editable, no te olvides de configurarloid
. Luego debe obtener suinnerHTML
elemento y cortar todas las líneas de freno. Y solo establece el colapso con los siguientes argumentos.fuente
fuente
Es muy difícil colocar el cursor en la posición correcta cuando tienes un elemento avanzado como (p) (span), etc. El objetivo es obtener (texto del objeto):
fuente
Estoy escribiendo un resaltador de sintaxis (y un editor de código básico), y necesitaba saber cómo escribir automáticamente un carácter de comillas simples y mover el cursor hacia atrás (como muchos editores de código hoy en día).
He aquí un fragmento de mi solución, gracias a la gran ayuda de este hilo, los documentos de MDN y la observación de muchas consolas moz.
Esto está en un elemento div contenteditable
Dejo esto aquí como agradecimiento, dándome cuenta de que ya hay una respuesta aceptada.
fuente
Hice esto para mi editor de texto simple.
Diferencias con otros métodos:
uso
selección.ts
fuente
Refactoré la respuesta de @ Liam. Lo puse en una clase con métodos estáticos, hice que sus funciones recibieran un elemento en lugar de un #id, y algunos otros pequeños ajustes.
Este código es particularmente bueno para fijar el cursor en un cuadro de texto enriquecido con el que podría estar haciendo
<div contenteditable="true">
. Estuve atrapado en esto durante varios días antes de llegar al siguiente código.editar: Su respuesta y esta respuesta tienen un error que implica presionar enter. Dado que enter no cuenta como un carácter, la posición del cursor se desordena después de presionar enter. Si puedo corregir el código, actualizaré mi respuesta.
edit2: ahórrate muchos dolores de cabeza y asegúrate de
<div contenteditable=true>
que sídisplay: inline-block
. Esto corrige algunos errores relacionados con la colocación de Chrome en<div>
lugar de<br>
presionar Intro.Cómo utilizar
Código
fuente
Creo que no es simple colocar a Caret en alguna posición en un elemento contento. Escribí mi propio código para esto. Omite el árbol de nodos que calcula cuántos caracteres quedan y establece el símbolo de intercalación en el elemento necesario. No probé mucho este código.
También escribí un código para obtener la posición actual de caret (no probé):
También debe ser consciente de que range.startOffset y range.endOffset contienen desplazamiento de caracteres para nodos de texto (nodeType === 3) y desplazamiento de nodo secundario para nodos de elementos (nodeType === 1). range.startContainer y range.endContainer pueden referirse a cualquier nodo de elemento de cualquier nivel en el árbol (por supuesto, también pueden referirse a nodos de texto).
fuente
Basado en la respuesta de Tim Down, pero verifica la última fila de texto "buena" conocida. Coloca el cursor al final.
Además, también podría verificar de forma recursiva / iterativa el último hijo de cada último hijo consecutivo para encontrar el último nodo de texto "bueno" absoluto en el DOM.
fuente