2010-11-27 4 views
14

Bunu yapmanın bir yolunu bulmaya çalışıyorum. Her biri yaklaşık 150px yüksekliğinde bir kutu listem var. Javascript (ve jquery) kullanıyorum ve bir kullanıcı sayfayı aşağı kaydırdıktan sonra sayfanın otomatik olarak kaydırılmasını ve böylece sayfaların geri kalanıyla satırların sıraya girmesini (yani, kullanıcının sayfanın pozisyonu 150 ile bölünemez, en yakın noktaya kaydırılır).Javascript: kullanıcı kaydırma tamamlandıktan sonra bir işlem yapın

Şimdi, bir olayın .scroll() jquery olayını kullanarak etkinleştirebileceğimi biliyorum ve .scrollTop() kullanarak belirli bir noktaya taşıyabiliyorum. Ancak, kullanıcının kaydırma çubuğunu hareket ettirdiği her piksel, tüm işlevi etkinleştirir. Bu nedenle, kullanıcının kaymayana dek fonksiyonu ateşlemenin bir yolu var mıdır ve eğer tekrar kaymaya başlayacaklarsa işlev durur mu?

cevap

19

Zaten jQuery kullanıyorsanız gibi, zaten (Sonra ne olduğu) yöntemlerden debouncing kolları Ben Alman's doTimeout plugin de bakabilirsiniz. utanmadan kendi web sitesinde çalınan

Örnek:

$(window).scroll(function(){ 
    $.doTimeout('scroll', 250, function(){ 
     // do something computationally expensive 
    }); 
}); 
+2

+1 Güzel eklenti ve yalnızca 1k. Çevrelemeye jQuery 1.5 :) –

+1

Dude dahil edilmelidir. Güzel ve parlak. Böyle bir eklentiyi sevdiğimi düşünmemiştim. – DavidR

+1

Birisinin bu fikri hayata geçirdiğini ve bununla başarıya ulaştığını umuyordum. Teşekkürler!! – Matt

6

Elbette, kaydırma olayının olay işleyicisinde, 100 veya 200 milisaniye sonra setTimeout'u kapatın. Kaydırma olay işleyicisinin içine ayarladığınız setTimeout işlevini, yukarıda belirttiğiniz konumlandırma mantığını yapın. Ayrıca, kaydırma olay işleyicisinin kendi belirlediği zamanaşımlarını temizleyin. Bu şekilde, kaydırma olayı en son tetiklendiğinde, scroll olayı temizlenmediğinden setTimeout işlevi tamamlanır.

6

kodu:

var scrollTimeout = null; 
var scrollendDelay = 500; // ms 

$(window).scroll(function() { 
    if (scrollTimeout === null) { 
     scrollbeginHandler(); 
    } else { 
     clearTimeout(scrollTimeout); 
    } 
    scrollTimeout = setTimeout(scrollendHandler, scrollendDelay); 
}); 

function scrollbeginHandler() { 
    // this code executes on "scrollbegin" 
    document.body.style.backgroundColor = "yellow"; 
} 

function scrollendHandler() { 
    // this code executes on "scrollend" 
    document.body.style.backgroundColor = "gray"; 
    scrollTimeout = null; 
} 
-1

Bu vanilya JavaScript yararlı olacak bir senaryo olurdu.

var yourFunction = function(){ 
    // do something computationally expensive 
} 

$(window).scroll(function(){ 
    yfTime=setTimeout("yourFunction()",250); 
}); 
+1

1) '$ (window)' javascript değil, jQuery ve 2) Bu, her bir kullanıcı için kaydırılan bir dizi setTimeouts ... – aug

6

Bu temelde Šime Vidas' cevabı ile aynıdır, ancak daha az comlex:

var scrollTimeout = null; 
$(window).scroll(function(){ 
    if (scrollTimeout) clearTimeout(scrollTimeout); 
    scrollTimeout = setTimeout(function(){yourFunctionGoesHere()},500); 
}); 

500 gecikmedir. Fare kaydırma için tamam olmalı.