2012-12-11 33 views
5

क्या यह पता लगाने में असमर्थ है कि क्या मोबाइल तत्व जावास्क्रिप्ट के माध्यम से मोबाइल सफारी में स्क्रॉल करना बंद कर दिया है?पता लगाएं कि क्या तत्व गति स्क्रॉलिंग बंद कर दिया है?

मेरे पास एक तत्व है जिसमें -webkit-overflow-scrolling:touch का उपयोग करके गति स्क्रॉलिंग है, और मुझे यह पता लगाने की आवश्यकता है कि तत्व स्क्रॉलिंग बंद कर दिया गया है, जिसमें गति को स्क्रॉल को प्रभावित करने के बाद भी शामिल है।

क्या यह संभव है? onscroll ईवेंट का उपयोग करना मेरे ऐप के अंदर काम नहीं कर रहा है।

उत्तर

8

आप एक स्वाइप वेग की गणना कर सकते हैं और कुछ थ्रेसहोल्ड मान के आधार पर गति स्क्रॉल होने पर पता लगाने की कोशिश कर सकते हैं। मैंने कुछ परीक्षण किया है और लगभग 0.25 पिक्सेल/एमएस एक अच्छा मूल्य प्रतीत होता है।

नोट: कभी-कभी गति कम करने के लिए गतिमान स्क्रॉलिंग भी होती है। मैंने जो गति स्क्रॉलिंग दर्ज की है, उसके लिए सबसे कम वेग 0.13 था (बहुत कम डेल्टा समय के साथ) ताकि आपको 100% सही समाधान की आवश्यकता हो, तो देखो।

उदाहरण कोड overscrolling का पता लगाता है और सौदों का पता लगाता है।

JQuery का उपयोग करना;

var scrollWrapper = $('#myWrapper'); 
var starTime, startScroll, waitForScrollEvent; 
scrollWrapper.bind('touchstart', function() { 
    waitForScrollEvent = false; 
}); 

scrollWrapper.bind('touchmove', function() { 
    startTime = new Date().getTime(); startScroll = scrollWrapper.scrollTop(); 
}); 

scrollWrapper.bind('touchend', function() { 
    var deltaTime = new Date().getTime() - startTime; 
    var deltaScroll = Math.abs(startScroll - scrollWrapper.scrollTop()); 
    if (deltaScroll/deltaTime>0.25 
     || scrollWrapper.scrollTop()<0 
     || scrollWrapper.scrollTop()>scrollWrapper.height()) { 
    // will cause momentum scroll, wait for 'scroll' event 
    waitForScrollEvent = true; 
    } 
    else { 
    onScrollCompleted(); // assume no momentum scroll was initiated 
    } 
    startTime = 0; 
}); 

scrollWrapper.bind('scroll', function() { 
    if (waitForScrollEvent) { 
    onScrollCompleted(); 
    } 
}); 
+0

यह शानदार है! मैं एक आंतरिक div scrollable बनाने में संघर्ष कर रहा हूं, और गति को सक्षम करके, सभी स्नैप तर्क मैं खिड़की से बाहर गया था। आप दो अल्पविराम गायब हैं और रैपर चर परिभाषित नहीं किया गया है। अन्यथा यह बहुत अच्छा है! – Chris

+0

खुशी है कि आपने इसे उपयोगी पाया है। त्रुटियों को इंगित करने के लिए धन्यवाद। – dagge

+0

बहुत अच्छा है। इसके लिए एक डेमो बनाओ। दूसरों के लिए परिणाम जल्दी से जांचना उपयोगी हो सकता है –

3

मेरे मामले में यह पूरी तरह से काम किया:

var timer; 
$(scrollWrapper).on('scroll',function(e){ 
    if(timer){ 
     clearTimeout(timer); 
    } 
    timer = setTimeout(function(){ 
     $(this).trigger('scrollFinished'); 
    }, 55) 
}) 



$(scrollWrapper).on('scrollFinished',function(){ 
     // will be called when momentum scroll is finished 
    }) 

प्रकाशित scrollfinished 'घटना जब स्क्रॉल रुक गया है।

+1

दिलचस्प तकनीक, कुछ विशेष उपयोग मामलों के लिए यह स्वीकार किए गए उत्तर से भी बेहतर हो सकती है (जैसा कि यह मेरे मामले में था)। +1 – Mtz

+0

ग्रेट सरल समाधान, मुझे समय को ट्विक करना था हालांकि लंबी लंबाई तक लंबी लंबाई – Arjan