Cuando incluyo un enlace a una sección de una página, al hacer clic en él, no modifica el historial del navegador. Al navegar hacia atrás, se sale de la página en lugar de volver a la posición de la página donde se definió el enlace.
Edición: Bueno, en este Discourse no puedo crear un elemento con un ID, así que no puedo demostrarlo aquí. El código fuente a continuación es lo que me gustaría hacer, pero esto es solo para ilustrar y no afecta la esencia de mi problema:
<div id="link-target"></div>
*Esta sección está enlazada desde arriba. No hay nada que ver aquí.*
Esto es algo esperado. Si haces clic en un enlace a otra publicación en el mismo tema, tampoco se añade a la pila de historial, y es un enlace completo sin fragmentos, por lo que nunca añadimos los enlaces dentro del tema al historial.
Encuentro este comportamiento extremadamente inesperado
Aquí hay una página de ejemplo sin JavaScript. En Chromium, al hacer clic en ese enlace, te lleva al final de la página. Al volver atrás, regresas al lugar desde donde hiciste clic. Ese es el comportamiento esperado que verás en cualquier otro sitio web que no consuma este historial.
Supongo que Discourse maneja los fragmentos de URL en JavaScript desplazándose a la ubicación, por lo que el historial tendría que ser empujado explícitamente.
@codinghorror expresa una opinión fuerte y definitiva sobre esto aquí. Es sorprendente ver una opinión tan firme sobre un cambio en el comportamiento estándar de los navegadores web. En justicia, aún no he usado Discourse para navegación intensiva por temas, por lo que no puedo apreciar la obviedad de su argumento.
Estoy usando Discourse en parte para documentación y este comportamiento es extremadamente disruptivo, hasta el punto de que tengo miedo de hacer clic en un enlace y perder mi lugar en una página.
Si tienes ganas de hacer clic en cualquiera de los enlaces del índice y luego volver a tu punto de partida usando el historial del navegador, no puedes.
¿Por qué proporcionar un índice en primer lugar?
¿Alguna sugerencia para aquellos sitios que deseen compatibilizar la navegación estándar del navegador?
Estoy investigando la modificación del comportamiento de desplazamiento al elemento, que sospecho que está detrás de esto, pero empiezo con literalmente cero conocimiento de la base de código ¡Llegaré allí eventualmente, pero si alguien tiene algunas indicaciones, agradezco la ayuda!
Dependiendo del contexto en el que vayas a usar tus anclajes, quizás este plugin de tabla de contenidos podría ser útil (y, en mi opinión, encajaría muy bien en la página de Términos de Servicio y Preguntas Frecuentes).
Ejemplo aquí.
Nunca me había dado cuenta de que esto me molestaba hasta que lo señalaste. A menudo he intentado volver al lugar donde hice clic en un enlace en Discourse y, en su lugar, terminaba en una página anterior. Es muy irritante. Siempre lo atribuí a una combinación de la aplicación de iOS, ya que la uso para casi todo lo relacionado con Discourse, y a un error del usuario.
Este componente TOC está muy bien hecho y lo estamos utilizando en todas las páginas de documentación; ¡estamos muy agradecidos por el trabajo invertido en él!
Sin embargo, persiste el problema de la navegación. Al hacer clic en un enlace del TOC no se modifica el historial del navegador y, por lo tanto, al volver se sale de la página.
Efectivamente es así. Sería genial solucionarlo, @Johani, pero tengo la sensación de que es muy complicado. Quizás simplemente debamos usar pushState al hacer clic en un enlace del índice.
Implementé una solución alternativa (que podría considerarse un enfoque adecuado para personalizar un sitio, dado el punto de vista de Discourse sobre la navegación por enlaces) mediante un componente de tema. Esto sigue el patrón utilizado por DiscoTOC, donde se agrega un marcador a una publicación para activar el comportamiento. El código aplicable está aquí.
Considero que modificar DiscoTOC para que utilice fragmentos de URL y el historial del navegador es una buena idea. Esto requiere cambiar el enfoque del componente en cuanto a la navegación, lo cual no es un cambio menor. DiscoTOC utiliza atributos de datos para pasar los objetivos en lugar de los href de los enlaces. No hay ningún intento de reflejar la nueva ubicación de la página en la URL del navegador (window.location).
Creo que el patrón que estoy utilizando arriba podría funcionar para DiscoTOC, pero eso tendría implicaciones más amplias para ese componente, dado su enfoque actual.
Creo que en este caso es pushState. El objetivo es permitir volver a la posición anterior, lo cual requiere un push al historial porque el evento se ha prevenido.