2015-02-20 14 views
54

शुद्ध जावास्क्रिप्ट में कोई विकल्प?document.body.scrollTop फ़ायरफ़ॉक्स रिटर्न 0: केवल जेएस

ओपेरा, क्रोम और सफारी में निम्नलिखित कार्य। अभी तक एक्सप्लोरर पर परीक्षण नहीं किया:

http://monkey-me.herokuapp.com

https://github.com/coolcatDev/monkey-me-heroku/blob/master/static/js/myscripts.js

पृष्ठ लोड पर '.Content' div के लिए नीचे स्क्रॉल करना चाहिए:

var destiny = document.getElementsByClassName('content'); 
var destinyY = destiny[0].offsetTop; 
scrollTo(document.body, destinyY, 200); 

function scrollTo(element, to, duration) { 
    if (duration <= 0) return; 
    var difference = to - element.scrollTop; 
    var perTick = difference/duration * 2; 

    setTimeout(function() { 
     element.scrollTop = element.scrollTop + perTick; 
     scrollTo(element, to, duration - 2); 
    }, 10); 
}; 
+0

यदि संभव हो तो शुद्ध सीएसएस में और भी बेहतर है! –

उत्तर

114

इस उपयोग करके देखें: document.documentElement.scrollTop। अगर मैं सही हूं document.body.scrollTop बहिष्कृत है।

अद्यतन

लगता है की तरह क्रोम, जवाब के साथ अदा नहीं करता है के रूप में टिप्पणी में @Nikolai Mavrenkov ने सुझाव दिया सुरक्षित उपयोग होने के लिए:

window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0

अब सभी ब्राउज़रों होना चाहिए ढका हुआ।

+0

Awsome। यह समाधान फ़ायरफ़ॉक्स के लिए काम करता है इसलिए फ़ायरफ़ॉक्स पर लोड होने पर मैं एक स्थिति में फेंक दूंगा। धन्यवाद –

+0

मैंने पुष्टि की है कि यह मेरी समस्या को भी ठीक करता है। –

+13

यह क्रोम के लिए काम नहीं करता है। 'Window.pageYOffset || का उपयोग करना सुरक्षित है document.documentElement.scrollTop || document.body.scrollTop || 0' –

38

IF शर्तों का उपयोग करने के बजाय, इस तार्किक अभिव्यक्ति की तरह कुछ उपयोग करके उचित परिणाम प्राप्त करने का आसान तरीका है।

var bodyScrollTop = document.documentElement.scrollTop || document.body.scrollTop; 

दोनों भाग डिफ़ॉल्ट रूप से शून्य लौटते हैं, इसलिए जब आपकी स्क्रॉल शून्य स्थिति पर होती है तो यह शून्य के रूप में शून्य हो जाएगी।

bodyScrollTop = 0 || 0 = 0 

पृष्ठ-स्क्रॉल पर उन हिस्सों में से एक शून्य शून्य लौटाएगा और दूसरा शून्य से कुछ संख्या वापस कर देगा। ध्यान केंद्रित किया मूल्य के लिए झूठे और फिर तार्किक या|| के रूप में परिणाम एक और मूल्य ले जाएगा (उदा। आपकी उम्मीद scrollTop है) मूल्यांकन करता है।

फ़ायरफ़ॉक्स की तरह ब्राउज़र देखें

bodyScrollTop = 0 || 300 = 300 

जो फिर से एक ही है और सही परिणाम देता है के रूप में

bodyScrollTop = 300 || 0 = 300 

और ब्राउज़र के बाकी इस अभिव्यक्ति देखेंगे।

वास्तव में, यह सब के बारे में something || nothing = something है :)

+1

यह वही है जो मैं खोज रहा था। – DevWL

+1

स्पष्टीकरण के लिए धन्यवाद! वास्तव में लोगों की मदद करता है, मैंने –

+0

@ जॉन_911 शामिल किया है यह स्टैक ओवरफ्लो का मुख्य उद्देश्य है;) – Wh1T3h4Ck5

14

मानक document.documentElement है और इस एफएफ और IE द्वारा प्रयोग किया जाता है।

वेबकिट document.body उपयोग करता है और पिछली संगतता के बारे में शिकायतों की वजह से मानक का उपयोग नहीं कर सकता है अगर वे मानक के लिए बदल दिया, इस पोस्ट में यह अच्छी तरह से बताते हैं

https://miketaylr.com/posts/2014/11/document-body-scrolltop.html

दस्तावेज है जो वेबकिट पर एक नई प्रॉपर्टी नहीं है अब समर्थन करता है

https://developer.mozilla.org/en/docs/Web/API/document/scrollingElement

तो यह सही तत्व को आप मिल जाएगा

var scrollingElement = document.scrollingElement || document.documentElement; 
scrollingElement.scrollTop = 100; 

और एक polyfill भी

https://github.com/mathiasbynens/document.scrollingElement

+1

मैंने प्लग-इन का उल्लेख किया है पॉलीफिल और 'document.body.scroll * 'को' document.scrollingElement.scroll *' में बदल दिया है और यह मेरे कोड में है ओएस एक्स पर क्रोम 52 और फ़ायरफ़ॉक्स 43 में ठीक काम करता है। धन्यवाद एंथनी –

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