es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo mover el cursor al nodo de texto y hacerlo editable si no hay contenido preexistente utilizando los objetos Range y Selection?

Estoy intentando hacer cambios de texto basados ​​en cuando el usuario hace clic en el botón “negrita” usando los objetos Range y Selection. Cuando el nodo de texto está vacío, el rango que he establecido usando setStart() y setEnd() no parece estar funcionando porque el cursor no se mueve al nodo de texto, sino que se queda en su nodo de texto inicial que ya se encuentra dentro de mi div con contenteditable. Sin embargo, si agrego un contenido preexistente al nodo de texto, el rango es correcto, el cursor se mueve al nodo de texto recién creado y el contenido aparece en negrita, así como mi entrada adicional. Entonces, ¿cómo puedo hacer que el cursor vaya al nodo de texto sin ningún contenido? Gracias.

Aquí hay un fragmento de código:

function setBold() {
    let parent = document.querySelector('.current'); // elemento padre editable
    let sel = window.getSelection();
    let selRange = sel.getRangeAt(0);
    let bold = document.createElement('b');
    let range = document.createRange();
    // si el nodo tiene contenido, esta solución funciona, pero en este ejemplo no tiene contenido actualmente
    let node = document.createTextNode("");
    parent.appendChild(node);
    range.setStart(node, 0);
    range.setEnd(node, node.length);
    range.surroundContents(bold);
    sel.removeAllRanges();
    sel.addRange(range);
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que tu problema actual está relacionado con establecer el inicio y el final del rango cuando el nodo de texto está vacío. Una solución que puedes probar es crear un nuevo nodo de texto con algún contenido (por ejemplo, un espacio) antes de establecer el rango.

    // crear un nuevo nodo de texto con un contenido
    let node = document.createTextNode(' ');
    
    // añadir el nuevo nodo de texto al elemento padre
    parent.appendChild(node);
    
    // establecer el inicio y el final del rango en el nuevo nodo de texto
    range.setStart(node, 0);
    range.setEnd(node, node.length);
    
    // realizar la operación de resaltado en negrita
    range.surroundContents(bold);
    
    // eliminar el nuevo nodo de texto
    parent.removeChild(node);
    
    // establecer el rango de selección en el contenido resaltado en negrita
    sel.removeAllRanges();
    sel.addRange(range);
    

    Al agregar un nuevo nodo de texto con algún contenido, puedes establecer el inicio y el final del rango en el nodo y realizar la operación de resaltado en negrita como se espera. Después de eso, puedes eliminar el nuevo nodo de texto y establecer el rango de selección en el contenido resaltado en negrita. Esto debería permitirte hacer que el cursor entre en el nodo de texto sin ningún contenido.

Comments are closed.