2011-10-12 11 views
9

Cuando una página carga un iframe con una url que termina en un #, la página principal se desplaza para que el cuerpo del iframe esté en la parte superior de la ventana del navegador.Evitar # ancla en un iframe al desplazarse por la ventana del navegador

Demostración: http://jsfiddle.net/dTQEE/1/

Si el URL termina en #, por ejemplo http://foo.com#, el navegador asume que desea ir a la parte superior de la página.

¿Cómo se evita que la ventana primaria se desplace cuando se carga un iframe con un fragmento hash?

El problema ocurre en Chrome, no estoy seguro si es un problema en otros navegadores.

En este momento la mejor solución que tengo es usar el.addEventListener('scroll', ...) para restablecer el scrollTop a 0 si no es 0. Esto funciona, pero el desplazamiento hacia abajo y hacia arriba son muy notables.

+1

¿Cómo está obteniendo la URL del marco? ¿No es posible verificar/editar antes de cargarlo? – sdleihssirhc

+1

Gracias por la sugerencia, pero el # podría tener algún significado para el sitio web que lo recibe. JS en la página dentro del iframe podría estar usándolo, así que no puedo quitarlo por completo. –

+0

¿Alguna vez resolvió esto para usted? –

Respuesta

0

No estoy seguro de que esto sea posible, pero debería intentar acceder al evento window.onhashchange y evitar el valor predeterminado. Si no, tendrás que quitar el hash si no lo sigue nada.

+0

Gracias - Lo intenté antes. El cambio solo se dispara cuando el hash de una página cambia, por lo que no se dispara en la carga. –

+0

Al menos en Chrome, (no estoy seguro acerca de otros navegadores), el evento onhashchange tiene un conjunto cancelable en falso, por lo que no puede usar preventDefault en el evento. –

0

Sé que esta es una pregunta antigua, pero la encontré en mi búsqueda por el mismo problema. Acabo de encontrar una solución que funciona maravillosamente para mí en Chrome.

<a href="dummylink.html" onclick="someFunction(); return false;"> 

El enlace href se utiliza para la barra de estado, pero debido a la return false; al final, en realidad no va a ninguna parte. Entonces, usted acaba de hacer su redirección (en mi caso fue un document.formName.submit();) dentro de su someFunction();. Ahora que lo pienso, puedes hacer todo en línea, pero eso no parece una buena forma a menos que solo tengas una cosa que hacer.

Nota: Si susomeFunction(); tiene return false; al final, eso no será suficiente para evitar los saltos.

Cuestiones relacionadas