2010-08-24 7 views
10

Ho qualche javascript che può apparire su molte pagine diverse. A volte queste pagine sono state accessibili tramite un URL contenente un riferimento di ancoraggio (# commento-100, ad esempio). In quei casi voglio che il javascript ritardi l'esecuzione fino a dopo che la finestra è saltata. In questo momento sto solo usando un ritardo, ma questo è piuttosto hacker e ovviamente non funziona in tutti i casi. Non riesco a trovare alcun tipo di evento DOM che corrisponda alla finestra "salta".Come posso sapere se una pagina è saltata all'ancora (#) in javascript?

A parte il semplice ritardo, l'unica soluzione che ho trovato è che JS cerchi l'ancora nell'URL e, se ne trova uno, controlla le modifiche in scrollTop. Ma sembra difettoso, e non sono sicuro al 100% che il mio script verrà sempre attivato prima che lo scorrimento avvenga, quindi verrà eseguito solo se l'utente scorrerà manualmente la pagina. Ad ogni modo, non mi piace molto la soluzione e preferirei qualcosa di più guidato dagli eventi. Eventuali suggerimenti?

Modifica per chiarire:

Non sto cercando di rilevare un cambiamento di hash. Prendiamo il seguente esempio:

  1. pagina index.php contiene un collegamento a post.php scatta # comment-1
  2. utente il link al post.php # comment-1
  3. post.php # comment- 1 carichi
  4. $ (document) incendi .ready
  5. Non molto tempo più tardi i rotoli del browser fino al # comment-1

sto cercando di rilevare in modo affidabile quando il passaggio 5 succede.

+0

'$ (document) .ready()' incendi troppo presto? –

+0

Sì, purtroppo lo fa. – Aaron

risposta

1

Sembra che sia possibile utilizzare window.onscroll. Ho provato questo codice solo ora:

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

che sembra funzionare.

Modifica: Hm, non funziona in IE8. Funziona sia in Firefox che in Chrome.

Modifica: jQuery ha un gestore .scroll(), ma viene attivato prima di scorrere su IE e non sembra funzionare per Chrome o Firefox.

+2

@ Gilsham - Cosa succede se la finestra scorre per un altro motivo? –

+0

true, immagino che dovresti separarlo dopo aver eseguito il codice una volta aggiungi la riga window.onscroll = null; dopo l'avviso e giunge bene – Gilsham

+0

potresti anche controllare la finestra.paginaYOffset dopo che la pagina è stata caricata e se è qualcosa sopra lo 0 la pagina è stata scorsa in basso – Gilsham

4

È possibile controllare window.onhashchange nei browser moderni. Se vuoi una croce compatibile, controlla http://benalman.com/projects/jquery-hashchange-plugin/

Questa pagina ha maggiori informazioni anche su window.onhashchange.

EDIT: Che, fondamentalmente, sostituire tutti i nomi di ancoraggio con una convenzione di collegamento simile, e quindi utilizzare .scrollTo per gestire lo scorrimento:

$(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 }}); 
    } 
}); 

Vedi jQuery: Scroll to anchor when calling URL, replace browsers behaviour per maggiori informazioni.

+2

@bryan: il problema non è la rilevazione di una modifica dell'hash, il problema è controllare se, nel caso in cui si utilizzi un hash, la finestra abbia già fatto scorrere verso il punto corretto. –

+0

@Peter Ajtai, Aaron: Potrebbe voler gestire lo scorrimento utilizzando il plugin js .scrollTo. È possibile utilizzare il parametro onAfter per eseguire le chiamate di funzione. http://flesler.blogspot.com/2007/10/jqueryscrollto.html –

+0

Dovrò cercare di vedere se .scrollTo può gestire la situazione in cui il caricamento iniziale della pagina ha un'ancora nell'URL. Ho avuto l'impressione .scrollTo ha semplicemente gestito lo scorrimento quando si fa clic sui collegamenti alle ancore all'interno della pagina corrente. – Aaron

0

per rilevare quando compare l'elemento sullo schermo, utilizzare il appear plugin:

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