2011-06-23 3 views
5

Y a-t-il un moyen d'empêcher $(window).scroll() de déclencher le chargement de la page?

En testant le code suivant dans Firefox 4, il se déclenche même lorsque je débranche la souris.

jQuery(document).ready(function($){  
$(window).scroll(function(){ 
       console.log("Scroll Fired"); 
    }); 
}); 
+0

aucun exemple où avez-vous besoin pour éviter le défilement? – genesis

+0

J'ai juste besoin d'empêcher l'événement de défilement d'être déclenché quand aucun défilement n'a lieu. –

+2

Méfiez-vous d'accrocher quoi que ce soit à l'événement scroll de la fenêtre http://ejohn.org/blog/learning-from-twitter/ – redsquare

Répondre

9

L'événement scroll n'est pas lié à la souris, il est appelé chaque fois qu'une nouvelle position de défilement de document est définie. Et sans doute cette position est définie lorsque le document se charge (vous pouvez le charger avec une ancre après tout), même si l'utilisateur appuie sur une touche de curseur sur son clavier. Je ne sais pas pourquoi vous devez ignorer l'événement scroll initial mais je suppose que vous voulez seulement le faire si pageYOffset est zéro. C'est facile:

var oldPageYOffset = 0; 
$(window).scroll(function(){ 
    if (window.pageYOffset != oldPageYOffset) 
    { 
    oldPageYOffset = window.pageYOffset; 
    console.log("Window scrolling changed"); 
    } 
}); 

Remarque: MSIE ne pas window.pageYOffset biens ainsi la volonté ci-dessus doivent être ajustés. Peut-être que jQuery propose une alternative cross-browser.

+0

Il est presque là, je dois littéralement juste empêcher le premier tour! –

+3

@Mild Fuzz: Vous obtiendrez de meilleures réponses si vous expliquez ce que vous voulez accomplir plutôt que comment vous voulez l'atteindre. pensez que ignorer le premier événement de défilement est la meilleure solution pour vous, mais ce n'est peut-être pas le cas (et impossible de dire si vous ne fournissez pas plus d'informations) De toute façon, vous pouvez également initialiser 'oldPageYOffset' avec' window.pageYOffset 'si vous voulez absolument ignorer l'événement initial 'scroll' –

0

bien sûr, ne le chargez pas après la charge. faites-en un rappel pour dormir pendant 500 millis.

+0

ce n'est pas le cas, le code ci-dessus est chargé dans 'jQuery (document) .ready (function ($) { ' –

+0

ajouté dans l'exemple code –

6

C'est la solution que j'ai choisie. Toutes les améliorations reçues avec gratitude.

var scroll = 0; 
    $(window).scroll(function(){ 
        if (scroll>0){ 
        console.log("Scroll Fired"); 
        } 
        scroll++; 
    }); 
+0

Bonne solution!:) – Steve

3

L'événement de défilement ne se déclenche pas à chaque chargement, que lors de l'actualisation d'une page qui défilait, ou lorsque vous naviguez vers un point d'ancrage directement.

La plupart des réponses suggèrent d'ignorer la première fois qu'elle est appelée, ce qui ignorerait un défilement valide si la page ne défile pas initialement.

//Scroll the page and then reload just the iframe (right click, reload frame) 
 

 

 
//Timeout of 1 was not reliable, 10 seemed to be where I tested it, but again, this is not very elegant. 
 
//This will not fire initially 
 
setTimeout(function(){ 
 
    $(window).scroll(function(){ 
 
    console.log('delayed scroll handler'); 
 
    }); 
 
}, 10); 
 

 
//This will fire initially when reloading the page and re-establishing the scroll position 
 
$(window).scroll(function(){ 
 
    console.log('regular scroll handler'); 
 
});
div { 
 
    height: 2000px; 
 
    border: 1px solid red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div> 
 
</div>

Questions connexes