2013-08-09 12 views
5

Po połączeniu funkcji przewijania i przewijania koła myszy, funkcja działa siedem lub osiem razy. Chcę, żeby uruchomił się tylko raz, kiedy raz przewińam kółko myszy, czy to możliwe? Używam tego kodu:jQuery - jak traktować przewijanie jako pojedyncze wydarzenie?

$(document).ready(function() { 
    $(window).bind('scroll', function() { 
     alert("Scroll.");   
    } 
    }); 
}); 
+0

ile scolling jest " pewnego razu"? Każda przeglądarka ma swoją własną rozdzielczość przewijania. Krótkie przewijanie może wywoływać wiele zdarzeń przewijania. To naturalne. – picios

+0

Kiedyś mam na myśli jeden nieprzerwany przewijanie, bez względu na to, jak długo – maciejjo

Odpowiedz

0

Jeśli przez „raz” to znaczy, raz-per-page-obciążeniu, można rozpiąć zdarzenia w słuchacza z metodą off(). http://api.jquery.com/off/

Istnieje również możliwość przestrzeni nazw wydarzeń jak:

scroll.namespace jest wciąż to samo zdarzenie, ale można rozpiąć go specjalnie.

$(document).ready(function() { 
    $(window).on('scroll.myEvent', function() { 
     $(window).off('scroll.myEvent'); 
     alert("Scroll.");   
    } 
    }); 
}); 
6

Spróbuj

$(document).ready(function() { 
    var timerId; 
    $(window).bind('scroll', function() { 
     clearTimeout(timerId) 
     timerId = setTimeout(function(){ 
      alert("Scroll.");   
     }, 200) 
    }); 
}); 

Demo: Fiddle

+0

@downvoter nie przeoczyłem niczego tutaj –

+0

To nie ja, ja + 1'd ciebie. Dla szybkości, jeśli nic innego;) –

+0

@RoryMcCrossan to znany problem i rozwiązanie –

4

Można używać funkcji przepustnicy z jQuery throttle debounce wtyczki.

$(function() { 
    $(window).bind('scroll', $.throttle(100, function() { 
     console.log('scroll'); 
    })); 
}); 
4

tylko odmianą Aruns odpowiedź:

podobne podejście, tak, że zdarzenie get natychmiast zwolniony, a następnie zapobiec należy obchodzić ponownie odstępie czasu. Abyś nie musiał czekać przed rozpoczęciem obsługi wydarzenia.

$(document).ready(function() { 
    var locked = false 
     , timeout; 

    $(window).bind('scroll', function() { 
     //do nothing if still locked 
     if(true === locked){ 
      return false; 
     } 
     //lock 
     locked = true; 

     //do something if not locked 
     alert('scroll!') 

     clearTimeout(timeout) 
     timeout = setTimeout(function(){ 
      //unlock 
      locked = false;   
     }, 1000) 
    }); 
}); 
+1

To rozwiązanie działa. Nie widzę, jak nie jest wyższa. – CyberHawk

+1

Ta odpowiedź powinna zostać przyjęta i najwyżej oceniona na pewno. – SISYN

0

Jeśli chcesz wykryć przewijanie tylko raz, użyj tego:

$(function() { 
    var done = false; 
    $(window).bind('scroll', function() { 
     if (!done){ 
      alert("Scroll."); 
      done = true; 
     } 
    }); 
}); 

ale jeśli chcesz, aby wykryć każde zdarzenie przewijania, spróbuj coś takiego odpowiedzi 4

Powiązane problemy