2011-10-12 11 views
9

Quando una pagina carica un iframe con un URL che termina con un #, la pagina padre scorre in modo che il corpo dell'iframe si trovi nella parte superiore della finestra del browser.Evita l'ancoraggio # in un iframe dallo scorrimento della finestra del browser

Demo: http://jsfiddle.net/dTQEE/1/

Se l'URL termina in #, per esempio http://foo.com#, il browser presume che tu voglia andare in cima alla pagina.

Come si impedisce alla finestra padre di scorrere quando viene caricato un iframe con un frammento hash?

Il problema si verifica in Chrome, non so se si tratta di un problema in altri browser.

In questo momento la soluzione migliore che ho è quello di utilizzare el.addEventListener('scroll', ...) per ripristinare il scrollTop-0 se non è già 0. Questo funziona, ma il rotolo verso il basso e l'scorrimento verso l'alto sono entrambi molto evidente.

+1

Come stai ottenendo l'URL per il frame? Non è possibile controllare/modificare prima di caricarlo? – sdleihssirhc

+1

Grazie per il suggerimento, ma il # potrebbe avere un significato per il sito Web che lo riceve. JS sulla pagina all'interno dell'iframe potrebbe usarlo, quindi non posso semplicemente toglierlo completamente. –

+0

è stato risolto per te? –

risposta

0

Non sono sicuro che sia possibile, ma dovresti provare a toccare l'evento window.onhashchange e impedire l'impostazione predefinita. In caso contrario, dovrai eliminare l'hash se non è seguito da niente.

+0

Grazie - l'ho provato prima. L'onhashchange viene attivato solo quando l'hash di una pagina cambia, quindi non viene attivato al caricamento. –

+0

Almeno in chrome, (non sono sicuro degli altri browser), l'evento onhashchange è cancellabile su false, quindi non puoi usare preventDefault sull'evento. –

0

So che questa è una vecchia domanda, ma l'ho trovata nella mia ricerca dello stesso problema. Ho appena trovato una soluzione che funziona meravigliosamente per me in Chrome.

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

Il collegamento href viene utilizzato per la barra di stato, ma a causa della return false;, alla fine, in realtà non va da nessuna parte. Quindi, devi solo eseguire il reindirizzamento (nel mio caso era un document.formName.submit();) all'interno del tuo someFunction();. A pensarci bene, potresti fare tutto in linea, ma non sembra una buona forma se non hai solo una cosa da fare.

Nota: Se il vostrosomeFunction(); ha return false; alla fine, che non sarà sufficiente ad evitare il salto.

Problemi correlati