2010-05-19 41 views
97

मैं एक आईपैड पर स्क्रॉल घटना को कैप्चर नहीं कर सकता। इनमें से कोई भी काम नहीं, मैं क्या गलत कर रहा हूं?आईफोन/आईपैड के लिए जावास्क्रिप्ट स्क्रॉल इवेंट?

window.onscroll=myFunction; 

document.onscroll=myFunction; 

window.attachEvent("scroll",myFunction,false); 

document.attachEvent("scroll",myFunction,false); 

वे सभी विंडोज़ पर सफारी 3 पर भी काम करते हैं। विडंबना यह है कि पीसी पर हर ब्राउज़र window.onload= का समर्थन करता है यदि आप मौजूदा घटनाओं को रोकना नहीं चाहते हैं। लेकिन आईपैड पर नहीं जाना।

उत्तर

133

आईफोनओएस onscroll घटनाओं को कैप्चर करता है, सिवाय इसके कि आप जिस तरह से उम्मीद कर सकते हैं। जब तक पेज चलती रुक जाता है और redraws-जैसा कि चित्र 6-1 में दिखाया गया है जब उपयोगकर्ता बंद हो जाता है पैनिंग-एक onscroll घटना उत्पन्न होता है

एक-उंगली पैनिंग किसी भी घटनाओं उत्पन्न नहीं करता है।

इसी प्रकार, 2 उंगलियों के साथ स्क्रॉल onscroll आग के बाद ही आप स्क्रॉल बंद कर दिया है।

प्रबंधक को इंस्टॉल की हमेशा की तरह काम करता है जैसे

window.addEventListener('scroll', function() { alert("Scrolled"); }); 
// or 
$(window).scroll(function() { alert("Scrolled"); }); 
// or 
window.onscroll = function() { alert("Scrolled"); }; 
// etc 

(यह भी देखें https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html)

+18

धन्यवाद, जिसने मुझे समस्या पर आगे देखने के लिए मजबूर किया। असली जवाब था iphone पर व्यूपोर्ट के शीर्ष का पता लगाने/iPad केवल साथ काम करता है 'window.pageYOffset' और नहीं ' document.body.scrollTop || document.documentElement.scrollTop' की तरह अस्तित्व में हर दूसरे ब्राउज़र/हार्डवेयर। –

+5

@ck_ दुर्भाग्य से आईपीएडी 'window.pageYOffset' पर मंदीकरण चरण में अद्यतन नहीं होता है, लेकिन केवल स्क्रॉल खत्म होने पर ही। – Adaptabi

+2

विंडो.ऑनक्रॉल को सीधे ओवरराइट करने के लिए यह खराब प्रथा है। एक ईवेंट श्रोता जोड़ना बेहतर होगा। Window.addEventListener ('स्क्रॉल', फ़ंक्शन() {अलर्ट ('स्क्रॉल किया गया!');}) का उपयोग करें; –

93

आईओएस के लिए आप स्क्रॉल घटना इस तरह के रूप में रूप में अच्छी तरह touchmove घटना उपयोग करने की आवश्यकता: एक और जवाब जोड़ने के लिए

document.addEventListener("touchmove", ScrollStart, false); 
document.addEventListener("scroll", Scroll, false); 

function ScrollStart() { 
    //start of scroll event for iOS 
} 

function Scroll() { 
    //end of scroll event for iOS 
    //and 
    //start/end of scroll event for other browsers 
} 
+31

यह ईवेंट केवल तब निकाल दिया जाता है जब उपयोगकर्ता सक्रिय रूप से स्क्रॉल कर रहा है, इसे गति स्क्रॉलिंग के क्षरण चरण के दौरान निकाल दिया नहीं जाता है। –

+0

मैंने आईओएस –

+0

के लिए एंड स्क्रॉल डिटेक्शन कोड शामिल करने के लिए कोड बदल दिया है, आप "touchend" के लिए श्रोता भी जोड़ना चाहेंगे जो डेस्कटॉप पर स्क्रॉल के समान कार्य करेगा। – BingeBoy

35

क्षमा करें एक पुरानी पोस्ट के लिए, लेकिन मुझे आमतौर पर इस कोड का उपयोग करके स्क्रॉल इवेंट बहुत अच्छी तरह मिलता है (यह कम से कम 6.1 पर काम करता है)

element.addEventListener('scroll', function() { 
    console.log(this.scrollTop); 
}); 

// This is the magic, this gives me "live" scroll events 
element.addEventListener('gesturechange', function() {}); 

और यह मेरे लिए काम करता है। केवल एक चीज जो नहीं करती है वह स्क्रॉल के मंदी के लिए एक स्क्रॉल इवेंट देती है (एक बार जब मंदी पूरी हो जाती है तो आपको अंतिम स्क्रॉल इवेंट मिलता है, जैसा कि आप इसके साथ करेंगे।) लेकिन यदि आप

कर कर सीएसएस के साथ जड़ता को अक्षम करते हैं
-webkit-overflow-scrolling: none; 

आप नहीं, अपने तत्वों पर जड़ता मिलता है शरीर के लिए ही आप ऐसा करने के लिए हो सकता है क्लासिक

document.addEventListener('touchmove', function(e) {e.preventDefault();}, true); 
+7

क्यों एक वैध उत्तर डाउनवोट करें और इसके साथ समस्या को समझाते हुए कोई टिप्पणी न छोड़ें? –

+3

क्योंकि डाउनवॉटिंग आसान और त्वरित है। :/ –

+2

एक उत्तर हमेशा अपने लेखक के अनुसार "वैध" है ... कोई भी जानबूझकर अमान्य जवाब पोस्ट नहीं करता है। लेकिन हाँ, उन्हें समझाया जाना चाहिए कि वे क्यों नीचे आ गए। –

6

मैं के साथ, iScroll के साथ इस समस्या के लिए एक महान समाधान प्राप्त करने में सक्षम था गति स्क्रॉलिंग का सब कुछ और सब कुछ https://github.com/cubiq/iscroll गीथब दस्तावेज़ महान है, और मैं ज्यादातर इसका पालन करता हूं। मेरे कार्यान्वयन का विवरण यहां दिया गया है।

HTML: मुझे लगता है कि iScroll उपयोग कर सकते हैं कुछ divs में मेरी सामग्री की स्क्रॉल करने योग्य क्षेत्र लिपटे:

<div id="wrapper"> 
    <div id="scroller"> 
    ... my scrollable content 
    </div> 
</div> 

सीएसएस: मैं मेरी शैली को लक्षित करने के "स्पर्श" के लिए Modernizr वर्ग के लिए इस्तेमाल किया केवल डिवाइस को स्पर्श करने के लिए परिवर्तन (क्योंकि मैंने केवल स्पर्श पर iScroll को तुरंत चालू किया)।

.touch #wrapper { 
    position: absolute; 
    z-index: 1; 
    top: 0; 
    bottom: 0; 
    left: 0; 
    right: 0; 
    overflow: hidden; 
} 
.touch #scroller { 
    position: absolute; 
    z-index: 1; 
    width: 100%; 
} 

जे एस: मैं iScroll डाउनलोड से iscroll-probe.js शामिल, और फिर उस नई पुस्तक स्थिति के प्रति प्रतिक्रिया के रूप में नीचे है, जहां updatePosition मेरी समारोह है स्क्रोलर प्रारंभ।

# coffeescript 
if Modernizr.touch 
    myScroller = new IScroll('#wrapper', probeType: 3) 
    myScroller.on 'scroll', updatePosition 
    myScroller.on 'scrollEnd', updatePosition 

आप myScroller का उपयोग करने के बजाय स्क्रॉल ऑफसेट को देखने का, अब वर्तमान स्थिति प्राप्त करने के लिए किया है। यहाँ एक समारोह http://markdalgleish.com/presentations/embracingtouch/ से लिया (एक सुपर उपयोगी लेख है, लेकिन अब पुराने हो चुके एक छोटे से)

function getScroll(elem, iscroll) { 
    var x, y; 

    if (Modernizr.touch && iscroll) { 
    x = iscroll.x * -1; 
    y = iscroll.y * -1; 
    } else { 
    x = elem.scrollTop; 
    y = elem.scrollLeft; 
    } 

    return {x: x, y: y}; 
} 

केवल अन्य पकड़ लिया गया था कभी-कभी मैं अपने पृष्ठ है कि मैं करने के लिए स्क्रॉल करने के लिए कोशिश कर रहा था का हिस्सा खो देगा है, और यह स्क्रॉल करने से इंकार कर देगा। जब भी मैंने #wrapper की सामग्री को बदल दिया, और समस्या को हल किया, तो मुझे myScroller.refresh() में कुछ कॉल जोड़ना पड़ा।

संपादित करें: एक अन्य गोचा था कि iScroll सभी "क्लिक" घटनाओं को खाता है। मैंने आईएसक्रॉल को "टैप" ईवेंट उत्सर्जित करने का विकल्प चालू कर दिया और "क्लिक" ईवेंट के बजाय उन्हें संभाला। शुक्र है कि मुझे स्क्रॉल क्षेत्र में ज्यादा क्लिक करने की आवश्यकता नहीं थी, इसलिए यह एक बड़ा सौदा नहीं था।

संबंधित मुद्दे