2013-06-01 10 views
6

Więc chciałbym odpalić funkcję tylko raz na zwoju (używając Scrollstop, wydane przez odpowiedź stackoverflow)zadziałać tylko raz na funkcję przewijania (scrollstop)

Problem polega na tym, że ja nie rozumiem uruchomić funkcję tylko raz. Próbowałem różnych rozwiązań (.on(), ustawienie licznika, ustawienie go na zewnątrz/wewnątrz funkcji window.scrollstop), ale nic nie działało.

Nie sądzę, że to trudne, ale ... Nie udało mi się sprawić, by działało tak daleko.

Oto plugin Używam

$.fn.scrollStopped = function(callback) {   
      $(this).scroll(function(){ 
       var self = this, $this = $(self); 
       if ($this.data('scrollTimeout')) { 
       clearTimeout($this.data('scrollTimeout')); 
       } 
       $this.data('scrollTimeout', setTimeout(callback,300,self)); 
      }); 
     }; 

i tu jest mój kod:

 $(window).scrollStopped(function(){ 
      if ($(".drawing1").withinViewport()) {  
       doNothing() 
       } 
      }) 


var doNothing = function() { 
      $('#drawing1').lazylinepainter('paint'); 
     } 

(usunięto licznik ponieważ nie działa)

Live demo here

PS: funkcja, którą chciałbym zrealizować tylko raz, to LeniPaint. Zaczyna się, gdy przewijamy do elementu, ale po jego zakończeniu strzela ponownie.

+0

, więc twoja funkcja doNothing() faktycznie coś robi? –

+0

@roasted Yep, głupia nazwa funkcji, Wiem: X – Naemy

Odpowiedz

6

jak o użyciu zmiennej, aby zobaczyć, czy to było wcześniej zwolniony:

var fired = 0; 
$.fn.scrollStopped = function(callback) {   
      $(this).scroll(function(){ 
       if(fired == 0){ 
       var self = this, $this = $(self); 
       if ($this.data('scrollTimeout')) { 
        clearTimeout($this.data('scrollTimeout')); 
       } 
       $this.data('scrollTimeout', setTimeout(callback,300,self)); 
       fired = 1; 
       } 
      }); 
     }; 
+0

Tak, zrobiłem to i zadziałało. Dzięki ! – Naemy

+0

Przykład: https://jsfiddle.net/mnz02mnc/1/ – aWebDeveloper

6

Oto moja wersja o ogień funkcyjny raz podczas słuchania przypadku przewijania:

var fired = false; 
window.addEventListener("scroll", function(){ 
    if (document.body.scrollTop >= 1000 && fired === false) { 
    alert('This will happen only once'); 
    fired = true; 
    } 
}, true) 
0

Jak ten temat rozwiązanie?

function scrollEvent() { 
    var hT = $('#scroll-to').offset().top, 
    hH = $('#scroll-to').outerHeight(), 
    wH = $(window).height(), 
    wS = $(this).scrollTop(); 
    if (wS > (hT+hH-wH)){ 
    console.log('H1 on the view!'); 
    window.removeEventListener("scroll", scrollEvent); 
    } 
} 
window.addEventListener("scroll", scrollEvent); 
+1

Ten fragment kodu może być rozwiązaniem, [w tym wyjaśnieniem] (// meta.stackexchange.com/questions/114762/explaining-entirely- oparte na kodzie odpowiedzi) naprawdę pomaga poprawić jakość twojego posta. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – peacetype

Powiązane problemy