Estoy construyendo una herramienta de anotación basada en la web, donde los usuarios finales pueden seleccionar y anotar una sección de texto de un documento HTML. Hablando de forma programática, acceder y trabajar con el texto seleccionado y el rango correspondiente es sencillo usando "window.getSelection" y "getRangeAt".¿Cómo soportar múltiples selecciones de texto en el navegador?
Me encuentro con un problema, sin embargo, cuando trato de poner todo esto junto en una aplicación de navegador cruzado. Todo funciona en Firefox, pero en Safari noté inmediatamente que cuando hago clic en un botón HTML (es decir, el botón "anotación"), la selección actual del texto del usuario desaparece, como si al hacer clic en el botón se cambiara el texto del cursor. Mi código que intenta acceder a window.getSelection se ejecuta desde una secuencia de comandos en este botón, que luego informa que no existe selección.
Investigué cómo Google Docs, específicamente su aplicación de procesamiento de textos maneja esto, ya que esencialmente el comportamiento y la mecánica de seleccionar texto y hacer clic en "Negrita" o "Cambiar fuente" corresponde a mi función de anotación. En Google Docs, cargan el texto del documento para editarlo en un iframe. Jugando con esto, aprendí que Firefox out-of-the-box admite múltiples rangos de selección en una página web que contiene múltiples marcos, o iframes. En otras palabras, puedo seleccionar una sección de texto en la página base, y una sección separada de texto en el iframe sin que la primera selección desaparezca. Esta solución de Google Docs funciona tanto para Firefox como para Safari (los dos navegadores que me interesan). Pero cuando construí una página de ejemplo simple para probar esta solución, no funcionaría en Safari. Tan pronto como hago clic en un botón o selecciono texto en la página raíz (fuera del iframe) el texto seleccionado del iframe actual desaparece.
¿Alguien sabe lo que me falta aquí para que esto funcione? ¿O tiene una sugerencia sobre otra forma de hacer que esto funcione?
¿Tiene esto en alguna parte que pueda vincular? – Jack