चूंकि डोम पहले स्क्रॉलिंग ईवेंट के बीच अलग-अलग होने का कोई तरीका नहीं देता है और बाद वाले लोग उसी स्क्रॉलिंग गति का हिस्सा बनते हैं, हम हैं उनके बीच अंतर करने के अप्रत्यक्ष तरीकों के बारे में सोचने के लिए मजबूर होना पड़ा।
यदि आप किसी भी विशेष तत्व के माध्यम से तेजी से स्क्रॉल करते हैं, तो अनुक्रम में कई बार स्क्रॉलिंग ईवेंट निकाल दिया जाता है।
// Using mouse wheelbar
251327626600149
251327626600215
251327626600265
251327626600282
251327626600332
251327626600365
// Using touchpad
251327626626207
251327626626225
251327626626261
251327626626276
251327626626312
251327626626345
:
$('#exampleDiv').bind('mousewheel', function() {
console.log(new Date().getTime());
});
आपको लगता है कि div पर स्क्रॉल, तो आप एक कंसोल आउटपुट कि इस तरह दिखता है मिल जाएगा: निम्नलिखित कोड का उपयोग करना, हम के बारे में वास्तव में कितनी बार ऐसा होता है एक विचार प्राप्त कर सकते हैं इस आउटपुट को देखते हुए, ऐसा लगता है कि mousescroll
घटनाओं को आम तौर पर किसी दूसरे के 20 एमएस और 60 एमएस के बीच कहीं भी निकाल दिया जाता है। सुरक्षित होने के लिए, हम ऊपरी छोर को 100 मीटर तक ले जाएंगे। यह बहुत जानकारीपूर्ण है, क्योंकि हम इसे स्क्रॉलिंग घटनाओं के बीच अंतर करने के लिए उपयोग कर सकते हैं जो एक ही क्रिया का हिस्सा हैं और जो उपयोगकर्ता द्वारा संभावित रूप से विशिष्ट और जानबूझकर शुरू किए जाते हैं।
आप यहां से क्या कर सकते हैं, वैश्विक स्तर पर सुलभ 'टाइमस्टैम्प' चर बनाने के लिए, इसे mousescroll
ईवेंट को हर बार अद्यतन किया जाता है, चाहे सफल हो या नहीं। कुछ इस तरह:
var timeStamp = new Date().getTime();
$('#exampleDiv').bind('mousewheel', function (event) {
var timeNow = new Date().getTime();
// Need to prevent the default scrolling behavior
event.preventDefault();
// If the last mousescroll happened less that 100 ms ago, update
// timeStamp and do nothing
if (timeNow - timeStamp < 100) {
timeStamp = timeNow;
return;
} else {
timeStamp = timeNow;
scrollToSomeOtherDiv();
}
});
यह प्रभावी रूप से सभी mousescroll
घटनाओं कि प्रारंभिक घटना है कि उन सब से पहले, लेकिन फिर से काम शुरू होता है उपयोगकर्ता के बाद 100 एमएस के लिए रोक दिया गया है के बाद निकाल दिया जाता है पर ध्यान नहीं देता।
यह आपकी समस्या का समाधान करेगा, सिवाय इसके कि आपके scrollToSomeOtherDiv()
फ़ंक्शन में कुछ प्रकार की समय लेने वाली एनीमेशन शामिल है। आप निश्चित रूप से एक वैश्विक बूलियन isAnimating
बना सकते हैं, और यह देखने के लिए जांचें कि प्रत्येक बार mousescroll
ईवेंट निकाल दिया गया है (एनीमेशन समाप्त होने के बाद इसे कॉलबैक में झूठा करना सुनिश्चित करें)।
यह काम करेगा, सिवाय इसके कि यह उपयोगकर्ता के लिए एक झटकेदार अनुभव प्रदान कर सकता है। कोई भी जो जल्दी से दो पैनलों के माध्यम से स्क्रॉल करना चाहता है, एनीमेशन शुरू होने के बाद भी स्क्रॉल के बीच रुकने की संभावना नहीं होगी। उपरोक्त कोड एक ही स्क्रॉलिंग गति के हिस्से के रूप में उनके सभी mousescroll
ईवेंट देखेंगे और उन्हें अनदेखा करना जारी रखेंगे!
उस स्थिति में, आप केवल एनीमेशन समय को अपनी दहलीज के रूप में उपयोग कर सकते हैं। एनीमेशन शुरू होने के बाद आप टाइमस्टैम्प सेट करते हैं और फिर उस अवधि के दौरान सभी mousescroll
ईवेंट अनदेखा करते हैं। मैं यहाँ एक उदाहरण ऊपर लिखा है: http://jsfiddle.net/Sg8JQ/
प्रासंगिक कोड यहाँ है:
var lastAnimation = 0;
var animationTime = 1000; // in ms
var quietPeriod = 500; // in ms, time after animation to ignore mousescroll
function scrollThis(event, delta, deltaX, deltaY) {
var timeNow = new Date().getTime();
// change this to deltaX/deltaY depending on which
// scrolling dir you want to capture
deltaOfInterest = deltaY;
if (deltaOfInterest == 0) {
// Uncomment if you want to use deltaX
// event.preventDefault();
return;
}
// Cancel scroll if currently animating or within quiet period
if(timeNow - lastAnimation < quietPeriod + animationTime) {
event.preventDefault();
return;
}
if (deltaOfInterest < 0) {
if ($('.active').next('div').length) {
lastAnimation = timeNow;
$('.active').removeClass('active').next('div').addClass('active');
$('html,body').animate({
scrollTop: $('.active').offset().top }, animationTime);
}
} else {
if ($('.active').prev('div').length) {
lastAnimation = timeNow;
$('.active').removeClass('active').prev('div').addClass('active');
$('html,body').animate({
scrollTop: $('.active').offset().top }, animationTime);
}
}
}
// Note: mousewheel() is defined in the mousewheel plugin by Brandon Aaron
// You could do without it, but you'd need to adjust for firefox and webkit
// separately.
//
// You couldn't use $(document).scroll() because it doesn't allow you to
// preventDefault(), which I use here.
$(document).mousewheel(scrollThis);
मैं भी quietPeriod
जो एनीमेशन समय जिसके दौरान आप mousescroll
घटनाओं की अनदेखी करने के जारी रखना चाहते हैं परे समय है को शामिल किया है । यदि आप एनीमेशन पूर्ण होने के बाद स्क्रॉल को 'उत्तरदायी' होना चाहते हैं तो आप इसे 0 पर सेट कर सकते हैं।
प्रत्येक समाधान जो मैंने तैयार किया है उसे स्थापित करने में शामिल देरी की तरह। परियोजना के लिए, डिजाइन मोड ने अंततः इस मुद्दे को अस्वीकार कर दिया, लेकिन यह अभी भी मुझे परेशान कर रहा है। कल कल मुझे एक ही गेंदबाज में एक समस्या थी - समान नहीं - जिसमें मुझे एनीमा रोकने की जरूरत थी टी() विंडो आकार बदलने पर। यह इस मुद्दे पर मेरा दिमाग वापस रख दिया। मेरा मानना है कि आपने जो सबसे कामुक/सबसे पुरानी चीज़ बनने के लिए प्रदान की है, वह आज तक आई है। इसके लिए, मैं आपको विजेता चिह्नित करता हूं। – wlangley
बहुत बढ़िया! कोड 'सेक्सी' के टुकड़े को कॉल करना उतना ही तारीफ है जितना मैं संभाल सकता हूं। मैं आपके शुरुआती डिजाइन विचार के बारे में सोच रहा था - हालांकि क्षैतिज स्क्रॉलिंग के साथ, आप अभी भी मैक पर जेस्चर के साथ कुछ मुद्दों में भाग लेंगे (क्योंकि दो अंगुली दोनों स्क्रॉल स्वाइप करती हैं और आपको क्रोम और सफारी पर इतिहास में वापस ले जाती हैं)। मुझे अभी तक _that_ समस्या के समाधान का पता लगाना बाकी है। – pikappa
500 से नीचे के मानों के साथ (एनीमेशनटाइम और शांत अवधि के बारे में बात करते हुए), यह पैटर्न काम करना बंद कर देता है। कम कीमतों के साथ अपने jsfiddle को फिर से प्रयास करें और आप उस बिंदु को देखेंगे, जहां मेरे दिमाग में, यह अपेक्षित काम करना बंद कर देता है। समाधान की सराहना की गई अगर – Ben