Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

180
Views
Tratando de envolver cada palabra que un usuario ingresa en un elemento contenteditable="true" en un div

El comportamiento que busco implementar envolvería cada palabra que el usuario escriba en <div class="word"></div> mientras escribe su mensaje. El div principal en el que están escribiendo tiene contenteditable="true".

Un factor de complicación es que, para este caso de uso, un div de "palabra" puede contener dos palabras (imagine que un nombre se consideraría una "palabra", por ejemplo, puede aparecer <div class="word">Bob Smith</div>). Esto significa que no puedo tomar todo el contenido del texto cuando el usuario presiona espacio y divide (" ") en una matriz para construir los elementos DOM div.word.

Estoy pensando que cuando el usuario presiona espacio, puedo obtener todos los nodos secundarios del div editable y recorrerlos para verificar cuál es un nodo de texto y cuál no (es decir, una palabra ya envuelta en div.word). Luego, solo para los nodos de texto, puedo crear un elemento DOM div.word y agregar todos estos al div editable.

Espero que esté claro. Aquí es donde estoy:

 <div id="editor" contenteditable></div>
 #editor { border: 1px solid #333; padding: 10px; } #editor .word { background: yellow; display: inline-block; }
 const editorElement = document.getElementById('editor'); function handleSpacebarPress() { // Get all editor child nodes let editorChildNodes = [...editor.childNodes]; // Clear editor of all child nodes editor.innerHTML = ''; editorChildNodes.forEach(node => { // If node is a text node (not a div.word element) if (node.nodeType === 3) { // Create div.word let wordDiv = document.createElement('div'); wordDiv.className = 'word'; wordDiv.textContent = node.textContent; editor.appendChild(wordDiv); } // Else node is already a div.word element else { editor.appendChild(node); } }); // Return caret to end of editor const editorLength = editor.childNodes.length; const lastNode = editor.childNodes[editorLength - 1]; // Last editor node const range = document.createRange(); const selection = window.getSelection(); range.setStart(lastNode, 1); range.collapse(true); selection.removeAllRanges(); selection.addRange(range); } editorElement.addEventListener('keydown', e => { if (e.code === 'Space') { handleSpacebarPress(); } });

Puede ver esto en jsfiddle aquí .

En este momento, parece que solo coloca todas las palabras directamente en el elemento div.word y parece que no puedo manejar la creación de una nueva para cada palabra.

¿Algunas ideas?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Supongo que quieres lograr algo como esto: Palabras resaltadas Tenga en cuenta que los espacios entre las palabras no están resaltados y, por lo tanto, deben estar dentro del editor principal. Puede solucionar esto (como señaló en los comentarios) agregando espacios después de cada palabra en el editor y recortando trim() -ming cada palabra para que no haya espacios al principio o al final de los nodos internos.

Debería repensar su código, porque tiene algunas desventajas.

  • Básicamente, está reimplementando lo que ya hacen los editores básicos con resaltado de sintaxis personalizado.
  • La configuración manual de la posición del cursor no funciona si está editando en medio del editor.
  • Copiar y pegar texto no activará handleSpacebarPress

Si desea programar el editor usted mismo, le sugiero que use una función de highlightWords que se activa después de cada evento de change (tal vez con algún retraso artificial). En esa función, puede usar una expresión regular para encontrar todas las palabras de acuerdo con sus criterios y reemplazarlas con <span class=word>$1</span> .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!