Creo que esto puede no ser posible, intentaré explicarlo lo mejor que pueda. Tengo una página que contiene pestañas (con jquery), controladas por lo siguiente:
Estoy usando este código, proporcionado por otro usuario de una pregunta anterior.
<script type="text/javascript">
$(function() {
$('html, body').animate({scrollTop:0}); // this is my "fix"
var tabContent = $(".tab_content");
var tabs = $("#menu li");
var hash = window.location.hash;
tabContent.not(hash).hide();
if(hash=="") {
$('#tab1').fadeIn();
}
tabs.find('[href=' + hash + ']').parent().addClass('active');
tabs.click(function() {
$(this).addClass('active').siblings().removeClass('active');
tabContent.hide();
var activeTab = $(this).find("a").attr("href");
$(activeTab).fadeIn();
return false;
});
});
</script>
este código funciona muy bien cuando visito la página de "pestañas" directamente.
sin embargo, necesito vincular a pestañas individuales de otras páginas, por lo que para hacer esto, el código obtiene y window.location.hash
luego muestra la pestaña apropiada.
la página no "salta" al ancla debido a "devolver falso".
Sin embargo, este evento solo se activa en un evento de clic. por lo tanto, si visito mis "pestañas" desde cualquier otra página, se activa el efecto "salto". Para combatir esto, me desplazo automáticamente a la parte superior de la página, pero preferiría que esto no sucediera.
¿Hay alguna forma de simular el "retorno falso" cuando se carga la página, evitando que se produzca el "salto" del ancla?
Espero que esté bastante claro.
Gracias
setTimeout
y no siempre funcionó. Probablemente no lo necesite si está en jQuery de$(function() {
todos modos. Realmente no necesita ellocation.hash
, pero es bueno dejarlo para que los navegadores no tengan que hacer nada. ¡También te recuerda para qué sirve scrollTo!if
debe haber fuera, no dentro. Además, el mínimo para el intervalo es de aproximadamente 10, por lo que 0 o 1 es lo mismo ... que 10. dependiendo del navegador.Vea mi respuesta aquí: Respuesta de Stackoverflow
El truco consiste en eliminar el hashtag lo antes posible y almacenar su valor para su propio uso:
Es importante que no ponga esa parte del código en las funciones $ () o $ (ventana) .load (), ya que sería demasiado tarde y el navegador ya se movió a la etiqueta.
fuente
Hay otras formas de rastrear en qué pestaña estás; quizás estableciendo una cookie, o un valor en un campo oculto, etc., etc.
Yo diría que si no desea que la página se cargue, será mejor que use una de estas otras opciones en lugar del hash, porque la razón principal para usar el hash en lugar de ellas es permitir exactamente lo que desea quieres bloquear.
Otro punto: la página no saltará si sus enlaces hash no coinciden con los nombres de las etiquetas en el documento, por lo que quizás, si desea seguir usando el hash, podría manipular el contenido para que las etiquetas tengan un nombre diferente. Si usa un prefijo consistente, aún podrá usar Javascript para saltar entre ellos.
Espero que ayude.
fuente
Usé la solución de dave1010, pero estaba un poco nervioso cuando la puse dentro de la función $ (). Ready. Entonces hice esto: (no dentro del $ (). Listo)
fuente
El navegador salta a
<element id="abc" />
si hay http://site.com/#abc hash en la dirección y el elemento con id = "abc" es visible. Por lo tanto, sólo debe ocultar el elemento por defecto:<element id="anchor" style="display: none" />
. Si no hay un elemento visible con id = hash en la página, el navegador no saltará.Cree un script que verifique el hash en la URL y luego busque y muestre el elemento apropiado (que está oculto por defecto).
Deshabilite el comportamiento predeterminado de "enlace tipo hash" vinculando un evento onclick a un enlace y especifique
return false;
como resultado del evento onclick.Cuando implementé pestañas, escribí algo así:
fuente
Ninguna de las respuestas no funciona lo suficientemente bien para mí, veo que la página salta para anclar y luego para arriba para algunas soluciones, algunas respuestas no funcionan en absoluto, puede que las cosas hayan cambiado durante años. Espero que mi función ayude a alguien.
fuente
$(document).ready(function () { preventAnchorScroll(); });
simplemente llame a la función al comienzo de su JavaScript. Lo probé ahora, funciona para mí en Chrome, Firefox y Opera.CSS sucio solo se corrige para permanecer desplazado hacia arriba cada vez que se usa el ancla (no es útil si aún desea usar anclajes para saltos de desplazamiento, muy útil para enlaces profundos):
fuente
Si bien la respuesta aceptada funciona bien, descubrí que a veces, especialmente en páginas que contienen imágenes grandes, la barra de desplazamiento saltará salvajemente usando
Lo que puede distraer bastante al usuario.
La solución con la que me decidí al final es bastante simple, y es usar una identificación diferente en el objetivo a la que se usó en
location.hash
P.ej:
Aquí está el enlace en alguna otra página.
Entonces, por supuesto, si hay un elemento con un ID de
tab2
en la página de pestañas, la ventana saltará a él al cargar.Entonces puede agregar algo a la identificación para evitarlo:
Y a continuación, puede añadir
"-noScroll"
alocation.hash
la javascript:fuente
En mi caso, debido al uso de un enlace de anclaje para la ventana emergente CSS, lo he usado de esta manera:
Simplemente guarde el pageYOffset primero al hacer clic y luego configure ScrollTop en eso:
fuente
Creo que encontré una forma de usar las pestañas de la interfaz de usuario sin rehacer la funcionalidad. Hasta ahora no he encontrado ningún problema.
Todo dentro de un evento listo. Antepone "tab_" para el hash, pero funciona tanto cuando se hace clic como cuando se carga la página con hash.
fuente
Esto funcionará con bootstrap v3
fuente
Otro enfoque
Intente verificar si la página se ha desplazado y solo luego restablezca la posición:
Heres a demo
fuente
No tuve mucho éxito con los
setTimeout
métodos anteriores en Firefox.En lugar de setTimeout, he usado una función de carga:
Lamentablemente, sigue teniendo muchos fallos.
fuente
No he tenido ningún éxito constante con estas soluciones.
Aparentemente debido al hecho de que el salto ocurre antes de Javascript => referencia ( http://forum.jquery.com/topic/preventing-anchor-jump )
Mi solución es colocar todos los anclajes en la parte superior de forma predeterminada con CSS.
Luego use jquery para desplazarse al padre del ancla de destino, o un hermano (tal vez una etiqueta em vacía)
Ejemplo de jquery para desplazarse cuando la URL se ingresa con hash
(la página no debe estar ya cargada en la ventana / pestaña, esto cubre enlaces de otras fuentes / externas)
También querrá evitar los clics de anclaje predeterminados mientras está en la página y luego desplazarse a sus objetivos
y jquery
Lo bueno de este método son los destinos de la etiqueta de anclaje, que permanecen estructuralmente al lado del contenido relevante, aunque su posición CSS está en la parte superior.
Esto debería significar que los rastreadores de los motores de búsqueda no tendrán ningún problema.
Saludos, espero que esto ayude a
Gray
fuente
Intente esto para evitar que el cliente realice cualquier tipo de desplazamiento vertical en hashchanged (dentro de su controlador de eventos):
(redibujar navegador)
fuente
Resolví mi promlem haciendo esto:
fuente