2017-07-24 5 views
1

J'essaie de vérifier l'événement deltaY dans un défilement encadreur et j'exécute une fonction seulement quand deltaY == 0.Ecoute de défilement sur l'encadreur scrollComponent

Il semble que l'encadreur (écrit dans coffeescript) n'a aucun moyen de vérifier cela. Y at-il une autre façon de dire (en pseudocode):

if the change of the Y scrolling has been zero for 30 frames, execute function 

scroll encadreur Les événements ont cette méthode:

scrollComp.isMoving 

trouvé que sur cette page: https://framer.com/docs/#scroll.scrollcomponent

Mais si j'essaie cela, rien ne s'imprime dans l'autre partie de la déclaration

if scrollComp.isMoving 
    print 'moving' 
else if scrollComp.isMoving == false 
    print 'stopped' 

/// ou cela ne fonctionne pas non plus:

if scrollComp.isMoving 
    print 'moving' 
else 
    print 'stopped' 

Répondre

2

L'équivalent coffeescript de == est is, qui est en fait équivalent à === (valeur contrôles et type). Cela étant dit, if scrollComp.isMoving == false est un peu difficile à dire, il est plus logique de dire quelque chose comme unless scrollComp.isMoving ou if(!scrollComp.isMoving) dans JS. Ok, pour une solution à votre problème (que je ne crois pas que l'une des deux choses ci-dessus va résoudre), lorsque vous exécutez ces instructions print, plus que probable que vous le faites lorsque le script démarre au lieu de le faire en async dans un gestionnaire d'événement. Lorsque votre page se charge est lorsque votre code entre dans cette instruction if/else, à quel point, vous ne faites pas défiler ce qui sera toujours false. Pour capturer le moment du défilement, et exécuter du code lorsque cela se produit, vous devez enregistrer un écouteur d'événement:

scrollComp.onMove -> 
    // Scrolling here! Do fancy stuff! 
    print scrollComp.isMoving  // 'true' 

Maintenant, pour être en mesure de déclencher un appel de fonction 30 secondes après défilement arrêté, nous devons garder piste du temps:

// Define interval as 30 seconds. 
// (expressed in milliseconds) 
interval = 30*1000 
time = Date.now() // set timer to now 

scrollComp.onMove -> 
    // We update the timer every time 
    // scroller moves. 
    time = Date.now() 

// We need to create an infinite loop 
// that will check the time since last 
// move of the scroller, and execute 
// a function when the time has surpassed 
// some threshold. 
setInterval -> 
    if (Date.now() - time) > interval 
    // It has been 30 seconds since 
    // scroller last moved. 
, 5000 

Ce dernier numéro 5000 est juste à quelle fréquence pour exécuter le contrôle du temps; Cela fonctionnera tous les 5000 ms.

Si vous voulez vraiment compter les trames, vous pouvez générer dynamiquement cette variable interval par calculating the frame rate et en utilisant du jujitsu algébrique.

+0

merci Ezra Chu! – EJW