Esto es lo que estoy tratando de lograr: cuando un usuario usa un mouse, teclado o toque para seleccionar texto dentro de "myDiv", quiero adquirir tres fragmentos discretos de HTML: el HTML antes de la selección (a la "izquierda" de ella), el HTML dentro de la selección y el HTML después de la selección (a la "derecha" de la misma). El html debería ser como aparecería con myDiv.innerHTML.¿Cómo obtener el HTML antes, dentro y después de una selección (no en textarea)?
La selección puede comenzar o finalizar dentro de un par de etiquetas (es decir, la selección aislada no es necesariamente válida HTML). No necesito lidiar con escenarios especiales como elementos de posición absoluta dentro de la selección; todas las selecciones que me interesan estarán restringidas a un div que contendrá etiquetas básicas como strong, em, ul, ol, h1, image y table.
Lo más parecido que he venido es usar rangy para enganchar la selección y llamar al selection.getRangeAt(0).cloneContents()
para obtener la selección HTML. Esto funciona bastante bien hasta que realice una selección que no es válida de forma aislada, y el navegador altera el código HTML del fragmento de documento para que sea válido.
Información adicional: He aquí por qué necesito esto:
Estoy creando un sistema de retroalimentación de documentos, por lo que necesito para salvar la información de selección a una base de datos para su posterior recuperación y reconstitución. Normalmente, guardaría la selección usando la ruta DOM y el texto seleccionado, pero el texto puede cambiar entre guardar y reconstituir. Por ejemplo, el autor podría mover párrafos enteros, eliminar secciones, etc. La ruta DOM se vuelve bastante inútil.
Así que mi plan (imperfecto) es almacenar la selección como [desplazamiento, longitud, html_snippet]. Esa es la "posición". También almacenaré los fragmentos de html que vinieron directamente antes y después del texto seleccionado. Este es el "contexto".
Utilizando una combinación de estos datos, podría reubicar el texto seleccionado la mayor parte del tiempo, incluso si se ha movido o ha cambiado parcialmente. Cuando eso falla, la interfaz de usuario tendrá una forma de abordarlo, pero me gustaría que ocurra con la menor frecuencia posible.
Superthanks!
Ese es un texto de lotta. –
Sí, estaba tratando de proporcionar la mayor cantidad de información posible, y en lugar de eso era desagradablemente prolijo. Justo ahora lo reduje un poco. :) –
Para que quede claro: ¿los fragmentos de HTML que necesita son exactamente como aparecen en la fuente HTML enviada al navegador? –