Tenemos algunas páginas que usan ajax para cargar contenido y hay algunas ocasiones en las que necesitamos un enlace profundo en una página. En lugar de tener un enlace a "Usuarios" y decirle a la gente que haga clic en "configuración", es útil poder vincular personas a la configuración de user.aspx #
Para permitir que las personas nos brinden enlaces correctos a las secciones (para soporte técnico, etc.), lo configuré para modificar automáticamente el hash en la URL cada vez que se hace clic en un botón. El único problema, por supuesto, es que cuando esto sucede, también desplaza la página a este elemento.
¿Hay alguna manera de desactivar esto? A continuación se muestra cómo lo estoy haciendo hasta ahora.
$(function(){
//This emulates a click on the correct button on page load
if(document.location.hash){
$("#buttons li a").removeClass('selected');
s=$(document.location.hash).addClass('selected').attr("href").replace("javascript:","");
eval(s);
}
//Click a button to change the hash
$("#buttons li a").click(function(){
$("#buttons li a").removeClass('selected');
$(this).addClass('selected');
document.location.hash=$(this).attr("id")
//return false;
});
});
Esperaba return false;
que detuviera el desplazamiento de la página, pero solo hace que el enlace no funcione en absoluto. Eso es solo comentado por ahora para que pueda navegar.
¿Algunas ideas?
Use
history.replaceState
ohistory.pushState
* para cambiar el hash. Esto no activará el salto al elemento asociado.Ejemplo
Demo en JSFiddle
* Si desea historial de soporte hacia adelante y hacia atrás
Comportamiento de la historia
Si está utilizando
history.pushState
y no desea desplazarse por la página cuando el usuario usa los botones del historial del navegador (hacia adelante / hacia atrás), consulte lascrollRestoration
configuración experimental (solo Chrome 46+) .Soporte de navegador
fuente
replaceState
Es probablemente la mejor manera de ir aquí. La diferencia es quepushState
agrega un elemento a su historial mientrasreplaceState
que no lo hace.body
que se desplaza, a veces es eldocumentElement
. Ver esta esencia de Diego PeriniCreo que pude haber encontrado una solución bastante simple. El problema es que el hash en la URL también es un elemento en la página a la que se desplaza. si solo antepongo algo de texto al hash, ahora ya no hace referencia a un elemento existente.
Ahora aparece la URL
page.aspx#btn_elementID
que no es una ID real en la página. Simplemente elimino "btn_" y obtengo el ID del elemento realfuente
/
aspecto lógico.Un fragmento de su código original:
Cambia esto a:
fuente
hash
propiedad hará que la página se desplace de todos modos.Recientemente construí un carrusel que se basa en
window.location.hash
mantener el estado e hice el descubrimiento de que los navegadores Chrome y webkit forzarán el desplazamiento (incluso a un objetivo no visible) con un tirón incómodo cuandowindow.onhashchange
se dispara el evento.Incluso intentando registrar un controlador que detiene la propagación:
No hizo nada para detener el comportamiento predeterminado del navegador. La solución que encontré fue usar
window.history.pushState
para cambiar el hash sin desencadenar los efectos secundarios indeseables.Luego puede escuchar tanto el evento de cambio de hash normal como
my.hashchange
:fuente
my.hashchange
es solo un ejemplo de nombre de eventoDe acuerdo, este es un tema bastante antiguo, pero pensé en incorporarlo ya que la respuesta 'correcta' no funciona bien con CSS.
Esta solución básicamente evita que el evento de clic mueva la página para que podamos obtener primero la posición de desplazamiento. Luego agregamos manualmente el hash y el navegador activa automáticamente un evento de hashchange . Capturamos el evento hashchange y volvemos a la posición correcta. Una devolución de llamada separa e impide que su código provoque un retraso al mantener su hackeo en un solo lugar.
fuente
Erm, tengo un método algo tosco pero definitivamente de trabajo.
Simplemente almacene la posición de desplazamiento actual en una variable temporal y luego reiníciela después de cambiar el hash. :)
Entonces, para el ejemplo original:
fuente
No creo que esto sea posible. Hasta donde sé, la única vez que un navegador no se desplaza a un cambio
document.location.hash
es si el hash no existe dentro de la página.Este artículo no está directamente relacionado con su pregunta, pero analiza el comportamiento típico del navegador al cambiar
document.location.hash
fuente
si usa el evento hashchange con el analizador hash, puede evitar la acción predeterminada en los enlaces y cambiar la ubicación. Hash agrega un carácter para tener una diferencia con la propiedad id de un elemento
fuente
Agregando esto aquí porque las preguntas más relevantes se han marcado como duplicados apuntando aquí ...
Mi situación es más simple:
a[href='#something']
)e.preventDefault()
$("html,body").stop(true,true).animate({ "scrollTop": linkoffset.top }, scrollspeed, "swing" );
window.location = link;
De esta manera, se produce el desplazamiento y no hay salto cuando se actualiza la ubicación.
fuente
La otra forma de hacerlo es agregar un div que esté oculto en la parte superior de la ventana gráfica. A este div se le asigna la identificación del hash antes de que se agregue el hash a la url ... para que no obtenga un desplazamiento.
fuente
Aquí está mi solución para pestañas con historial habilitado:
Y para mostrar la última pestaña seleccionada:
Tenga
*=
en cuenta el en lafilter
llamada. Esto es algo específico de jQuery, y sin él, sus pestañas habilitadas para el historial fallarán.fuente
Esta solución crea un div en el scrollTop real y lo elimina después de cambiar el hash:
opcional, desencadenando evento de anclaje en la carga de la página:
fuente
Tengo un método más simple que funciona para mí. Básicamente, recuerda cuál es el hash en HTML. Es un enlace de anclaje a una etiqueta de Nombre. Es por eso que se desplaza ... el navegador está intentando desplazarse a un enlace de anclaje. Entonces, ¡dale uno!
Nombra tus divs de sección con clases en lugar de ID.
En su código de procesamiento, elimine la marca hash y reemplácela con un punto:
Finalmente, elimine element.preventDefault o return: false y permita que ocurra la navegación. La ventana permanecerá en la parte superior, el hash se agregará a la URL de la barra de direcciones y se abrirá el panel correcto.
fuente
Creo que debe restablecer el desplazamiento a su posición antes del cambio de hash.
fuente
Si en su página usa la identificación como una especie de punto de anclaje, y tiene escenarios en los que desea que los usuarios agreguen #algo al final de la URL y que la página se desplace a esa sección #algo usando su propia animación animada definida función javascript, el detector de eventos hashchange no podrá hacer eso.
Si simplemente coloca un depurador inmediatamente después del evento hashchange, por ejemplo, algo como esto (bueno, uso jquery, pero entiende el punto):
Notarás que tan pronto como cambies tu URL y presiones el botón Intro, la página se detendrá en la sección correspondiente inmediatamente, solo después de eso, se activará tu propia función de desplazamiento definida, y se desplazará a esa sección, que se ve muy mal.
Mi sugerencia es:
no use id como punto de anclaje a la sección a la que desea desplazarse.
Si debe usar una identificación, como lo hago yo. Utilice el detector de eventos 'popstate' en su lugar, no se desplazará automáticamente a la sección que agrega a la url, en su lugar, puede llamar a su propia función definida dentro del evento popstate.
$(window).on('popstate', function(){myscrollfunction()});
Finalmente necesita hacer un pequeño truco en su propia función de desplazamiento definida:
elimine la identificación de su etiqueta y reiníciela.
Esto debería funcionar.
fuente
Solo agregue este código a jQuery en el documento listo
Ref: http://css-tricks.com/snippets/jquery/smooth-scrolling/
fuente