2010-08-24 14 views
10

Tengo algunos javascript que pueden aparecer en muchas páginas diferentes. Algunas veces se ha accedido a esas páginas a través de una URL que contiene una referencia de anclaje (# comment-100, por ejemplo). En esos casos, quiero que javascript demore la ejecución hasta que la ventana haya saltado. En este momento estoy usando un retraso, pero es bastante hackish y obviamente no funciona en todos los casos. Parece que no puedo encontrar ningún tipo de evento DOM que corresponda a la ventana "saltar".¿Cómo puedo saber si una página saltó al ancla (#) en javascript?

Aparte de la simple demora, la única solución que he encontrado es hacer que el JS busque el ancla en la URL y, si encuentra una, ver los cambios en scrollTop. Pero parece fallar, y no estoy 100% seguro de que mi script siempre se dispare antes de que ocurra el desplazamiento, por lo que solo se ejecutará si el usuario desplaza manualmente la página. De todos modos, realmente no me gusta la solución y preferiría algo más impulsado por el evento. ¿Alguna sugerencia?

Editar para aclarar:

No estoy tratando de detectar un cambio de hash. Tomemos el siguiente ejemplo:

  1. página index.php contiene un enlace a post.php # comment-1
  2. usuario hace clic en el enlace a post.php # comment-1
  3. post.php # comentario- 1
  4. cargas
  5. $ (document) incendios ready
  6. No mucho más tarde, los rollos del navegador hacia abajo a # comment-1

estoy tratando de detectar de forma fiable cuando ocurre el paso 5.

+0

'$ (document) ready()' incendios demasiado pronto? –

+0

Sí, lamentablemente sí. – Aaron

Respuesta

1

Parece que podría usar window.onscroll. Probé este código ahora:

<a name="end" /> 
<script type="text/javascript"> 
    window.onscroll = function (e) { 
     alert("scrolled"); 
} 
</script> 

que parece funcionar.

Editar: Hm, no funciona en IE8. Sin embargo, funciona tanto en Firefox como en Chrome.

Editar: jQuery tiene un controlador .scroll(), pero se dispara antes de desplazarse en IE y no parece funcionar para Chrome o Firefox.

+2

@Gilsham: ¿y si la ventana se desplaza por otro motivo? –

+0

cierto, supongo que tendrías que desvincularlo después de haber ejecutado el código una vez simplemente agrega la línea window.onscroll = null; después de la alerta y se ve bien – Gilsham

+0

también puede verificar la ventana.pageYOffset después de que la página se haya cargado y si es algo superior a 0, la página se ha desplazado hacia abajo – Gilsham

4

Puede marcar window.onhashchange en los navegadores modernos. Si quieres cross compatible, echa un vistazo a http://benalman.com/projects/jquery-hashchange-plugin/

Esta página tiene más información sobre window.onhashchange también.

EDIT: Es, básicamente, reemplaza todos los nombres de vínculos con una convención de enlace similar, y luego usar .scrollTo para garantizar el desplazamiento:

$(document).ready(function() { 
    // replace # with #_ in all links containing # 
    $('a[href*=#]').each(function() { 
     $(this).attr('href', $(this).attr('href').replace('#', '#_')); 
    }); 

    // scrollTo if #_ found 
    hashname = window.location.hash.replace('#_', ''); 
    // find element to scroll to (<a name=""> or anything with particular id) 
    elem = $('a[name="' + hashname + '"],#' + hashname); 

    if(elem) { 
     $(document).scrollTo(elem, 800,{onAfter:function(){ 
     //put after scroll code here }}); 
    } 
}); 

Ver jQuery: Scroll to anchor when calling URL, replace browsers behaviour para obtener más información.

+2

@bryan: el problema no es detectar un cambio de hash, el problema es comprobar si, en el caso de que se use un hash, la ventana ya se ha desplazado al lugar correcto. –

+0

@Peter Ajtai, Aaron: Puede que desee manejar su desplazamiento utilizando el plugin .scrollTo jQ. Puede usar el parámetro onAfter para ejecutar sus llamadas a funciones. http://flesler.blogspot.com/2007/10/jqueryscrollto.html –

+0

Tendré que mirar para ver si .scrollTo puede manejar la situación en la que la carga de la página inicial tiene un ancla en la URL. Estaba bajo la impresión .scrollTo meramente manejaba el desplazamiento al hacer clic en los enlaces a los anclajes dentro de la página actual. – Aaron

0

para detectar cuando aparezca el elemento de la pantalla, utilice el appear plugin:

$('#comment-1').appear(function() { 
    $(this).text('scrolled'); 
}); 
Cuestiones relacionadas