2011-05-12 2 views
7

Fondamentalement, je voudrais faire un pré-traitement avant que les éléments DOM ne défilent. Le problème est que l'événement scroll est déclenché APRÈS le défilement des éléments DOM. Je sais que lorsque vous utilisez la molette de la souris pour faire défiler, l'événement de roulette mousewheel est déclenché avant que les éléments DOM ne défilent, bien qu'il ne vous fournisse pas la position de défilement anticipée et il ne s'agit que d'un type de défilement. Je me demande s'il y a un événement qui se déclenche pour chaque méthode de défilement (par exemple, mousewheel, en faisant glisser la barre de défilement, en poussant la flèche vers le bas, etc.) AVANT que les éléments DOM ne défilent. Ce ne doit pas être un événement. Je n'essaie pas de faire défiler jusqu'à une certaine position afin que scrollTo ne soit pas applicable.Événement qui est déclenché avant (pas après!) Les éléments DOM sont déroulés en javascript

La chaîne de l'événement avec le défilement: utilisateur fait défiler -> éléments DOM défiler physiquement -> déclenche l'événement OnScroll -> stuff poignée

La chaîne souhaitée de l'événement: utilisateur fait défiler -> un événement est capturé et fais ce que je veux faire -> éléments DOM défilement physique -> déclenche l'événement OnScroll -> stuff poignée

+7

Je crois que vous n'avez pas de chance. – epascarello

+3

Qu'est-ce que vous essayez de faire avant le défilement DOM qui ne peut pas être fait lorsque l'onScroll se déclenche même? Si vous partagez cette information avec nous peut-être que nous pouvons vous guider vers une solution alternative. –

+0

J'essaie de "coller" du contenu.Au fur et à mesure que l'utilisateur défile et que la partie supérieure du défilement atteint un certain pixel, certains éléments DOM commencent à "coller". A ce bref moment pour "coller" (en remplaçant l'élément d'origine par l'élément cloné et la position où il devrait "coller"), le navigateur semble scintiller. Si je positionne les éléments clonés juste avant le défilement (testé avec l'événement mousewheel), il ne scintille pas. –

Répondre

0

Voici quelque chose que vous pourriez vouloir essayer.

Donnez à votre page overflow:hidden de sorte qu'aucune barre de défilement n'apparaisse, puis placez une div absolument positionnée avec la largeur correcte & hauteur sur le contenu. Lorsque cette div est défilée, vous pouvez ensuite mettre à jour tout contenu sous-jacent avant de re-déclencher l'événement.

Vous devez également passer par des clics, etc., donc c'est vraiment un hack. Quelque chose comme jQuery aiderait à déclencher les événements et à mesurer la hauteur du contenu.

EDIT: css pointer-events:none peut vous aider en fonction de votre navigateur. Voir https://developer.mozilla.org/en/css/pointer-events

+0

Je pense que c'est le seul moyen. –

+0

@Chris Hong: Je ne suis pas d'accord. 'pointer-events' peut aider pour Chrome, Safari et Firefox, mais à part ça, il faudra beaucoup de JavaScript pour approximer les positions de la souris afin que le curseur change pour identifier les liens. Les attributs 'title' seraient inutiles et la sélection de texte serait encore plus difficile. Ce n'est certainement pas le chemin à parcourir, pirater ou non. Un hack plus robuste impliquerait de capturer les événements 'onmousewheel',' DOMMouseScroll' et 'keydown' pour détecter quand un utilisateur fait défiler, mais cela n'aide pas quand ils font glisser la barre de défilement. –

+0

En y réfléchissant encore plus, le DIV ne devrait pas couvrir le contenu, en fait il pourrait être juste 1px de large sur la marge de droite, provoquant une barre de défilement qui est ensuite utilisée pour capturer et déclencher tous les événements de défilement (il serait le seul élément qui n'était pas overflow: caché). Et soit nous aurions besoin d'une minuterie pour obtenir la hauteur du document actuel, soit construire une solution compatible 'height: 100%' –

0

le mieux que vous pouvez faire est quand onScroll feux, si scrollTop>thingToStick la distance d » à partir du haut, puis définissez position: fixed sur thingToStick sinon, réglez position sur ce qu'il était à l'origine y. Ça va scintiller en changeant de coller à coller, mais à part ça, vous n'obtiendrez aucun scintillement.

dans le code-ish sudo:

onScroll = function() 
{ 
    if(scrollTop > thingToStick.y) 
     thingToStick.position = "fixed"; 
    else 
     thingToStick.position = "relative"; 
} 

Dans les navigateurs qui ne prennent pas en charge fixed positionnement, vous êtes coincé avec le scintillement ...

+0

Merci pour le conseil. Mais nous essayons d'éviter tout scintillement. –

+0

pas beaucoup d'autre que vous pouvez faire, j'ai peur .. – MicronXD

0

jamais tryed avant, mais de briser les chaîne de cas, il serait possible de:

  1. capture l'événement de défilement
  2. Faites vos trucs
  3. Utilisation preventDefault() et stopPropagation pour inhiber l'événement
  4. Faux un nouvel événement de défilement en utilisant l'original (cela devrait être possible, je pense)

Hope cela vous aidera.

+0

Au moment où vous capturez l'événement de défilement, les éléments ont déjà été défilé. –

+1

Scroll est un événement asynchrone, c'est pourquoi il ne peut pas être évité via l'objet événement scroll que vous recevez dans les écouteurs onscroll;) – csuwldcat

Questions connexes