2009-05-16 17 views
59

ब्राउज़र विंडो के scrollTop का पता लगाने के लिए सबसे अच्छा क्रॉस-ब्राउज़र तरीका क्या है? मैं किसी पूर्व-निर्मित कोड पुस्तकालयों का उपयोग नहीं करना पसंद करता क्योंकि यह एक बहुत ही सरल लिपि है, और मुझे उस सभी डेडवेट की आवश्यकता नहीं है।स्क्रॉल का पता लगाने के लिए क्रॉस-ब्राउजर विधि ब्राउज़र विंडो का टॉप

उत्तर

84
function getScrollTop(){ 
    if(typeof pageYOffset!= 'undefined'){ 
     //most browsers except IE before #9 
     return pageYOffset; 
    } 
    else{ 
     var B= document.body; //IE 'quirks' 
     var D= document.documentElement; //IE with doctype 
     D= (D.clientHeight)? D: B; 
     return D.scrollTop; 
    } 
} 

alert(getScrollTop()) 
+4

यह विधि मैक या लिनक्स पर फ़ायरफ़ॉक्स ब्राउज़र के साथ काम नहीं कर रही है। – hypervisor666

+1

बदसूरत चेतावनी! इसके बजाय कंसोल और console.log का उपयोग करें! , वैसे भी अच्छा जवाब है, लेकिन "// अधिकांश ब्राउज़रों" का ब्राउज़र समर्थन क्या है - या बेहतर IEwhatnumber + इसका समर्थन कर रहा है? –

+0

क्या यह छोटा संस्करण पर्याप्त है? 'var scrollTop = pageYOffset || (document.documentElement.clientHeight? document.documentElement.scrollTop: document.body.scrollTop); ' – Roman

-3

आप सभी मुसीबत ऐसे jQuery या mootools है कि एक लाइन (पार ब्राउज़र) mootools में अपनी $ ('तत्व') में इन सभी मूल्यों की गणना करता है के रूप में एक ढांचे का उपयोग बचाने के लिए getTop()।; jquery में आपको आयाम नामक एक प्लगइन की आवश्यकता होगी यदि मुझे सही ढंग से याद है, हालांकि अधिकांश समय ढांचे के बिना भी आप element.getScrollTop() का उपयोग कर सकते हैं; उस तत्व के लिए पूर्ण सीएसएस विशेषता: तुम क्या आवश्यकता होगी समस्या सिर्फ IE7 पर और इस गणना से कम है कुछ हद तक गाड़ी है, क्योंकि यह नहीं उदाहरण के लिए विचार में तत्व की स्थिति को मान ले नहीं करता है अगर आप एक स्थिति मिल पाने के लिए गणना, आप एक पूरे JavaScript लाइब्रेरी शामिल करने के लिए नहीं करना चाहते हैं उस तत्व

+0

एफवाईआई - सवाल बताता है "मैं किसी पूर्व-निर्मित कोड पुस्तकालयों का उपयोग नहीं करना पसंद करता हूं"। आपको चिह्नित किया गया है क्योंकि mooTools अभी भी एक पूर्व-निर्मित कोड लाइब्रेरी है। योगदान देने के लिए समय निकालने के लिए धन्यवाद, बस प्रश्न को थोड़ा और अच्छी तरह से पढ़ें या आपका प्रतिनिधि हिट – iancrowther

+0

भी ले जाएगा, इस दृष्टिकोण के साथ एक और समस्या यह है कि यदि आप इसे मुख्य विंडो स्क्रॉलबार, गैर-आईई ब्राउज़र के लिए पहचानने का प्रयास कर रहे हैं तत्व स्क्रॉल करेगा और आईई स्क्रॉल करेगा। तो, आपको यह पता लगाना होगा कि 'तत्व' पहले क्या है। –

12

की मूल तत्व पर किया जाता है तो आप अक्सर बिट्स आप एक से चाहते निकाल सकते हैं।

उदाहरण के लिए, इस अनिवार्य रूप से कैसे jQuery implements एक क्रॉस-ब्राउज़र पुस्तक है (ऊपर | बाएं):

function getScroll(method, element) { 
    // The passed in `method` value should be 'Top' or 'Left' 
    method = 'scroll' + method; 
    return (element == window || element == document) ? (
    self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] || 
    (browserSupportsBoxModel && document.documentElement[method]) || 
    document.body[method] 
) : element[method]; 
} 
getScroll('Top', element); 
getScroll('Left', element); 

नोट: आप देखेंगे कि इसके बाद के संस्करण कोड एक browserSupportsBoxModel चर जो अपरिभाषित है शामिल हैं। jQuery defines this अस्थायी रूप से पृष्ठ पर एक div जोड़कर और फिर कुछ विशेषताओं को मापने के लिए यह निर्धारित करने के लिए कि ब्राउज़र सही ढंग से बॉक्स मॉडल लागू करता है या नहीं। जैसा कि आप आईई के लिए इस ध्वज जांच की कल्पना कर सकते हैं। विशेष रूप से, यह IE 6 or 7 in quirks mode के लिए जांचता है। चूंकि पता लगाने के बजाय जटिल है, मैंने इसे आपके लिए एक अभ्यास के रूप में छोड़ दिया है ;-), मान लीजिए कि आप पहले से ही browserfeaturedetection अपने कोड में कहीं और इस्तेमाल कर चुके हैं।

संपादित करें: आप पहले से ही अनुमान लगाया नहीं किया है, मैं दृढ़ता से आप चीजों के इन प्रकार के लिए एक पुस्तकालय का उपयोग सुझाव देते हैं। ओवरहेड मजबूत और भविष्य के सबूत कोड के लिए भुगतान करने के लिए एक छोटी सी कीमत है और कोई भी क्रॉस-ब्राउज़र ढांचे के निर्माण के लिए अधिक उत्पादक होगा। (आईई के खिलाफ अपने सिर को टक्कर लगी अनगिनत घंटे खर्च करने के विरोध में)।

2

YUI 2.8.1 कोड इस करता है:

function getDocumentScrollTop(doc) 
{ 
    doc = doc || document; 

    //doc.body.scrollTop is IE quirkmode only 
    return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop); 
} 

मैं jQuery 1.4.2 कोड (एक सा मनुष्य के लिए अनुवाद) और मैं मान समझा यह ठीक करता है इस बारे में सोच:

function getDocumentScrollTop(doc) 
{ 
    doc = doc || document; 
    win = doc.defaultView || doc.parentWindow; //parentWindow is for IE < 9 

    result = 0; 
    if("pageYOffset" in win) //I'don't know why they use this, probably they tested it to be faster than doing: if(typeof win.pageYOffset !== 'undefined') 
     result = win.pageYOffset; 
    else 
     result = (jQuery.support.boxModel && document.documentElement.scrollTop) || 
       document.body.scrollTop; 

    return result; 
} 

दुर्भाग्यवश jQuery.support.boxModel का मूल्य निकालने लगभग असंभव है क्योंकि आप करने के लिए होगा दस्तावेज़ में एक अस्थायी बाल तत्व जोड़ें और एक ही परीक्षण jQuery करता है।

5
function getSize(method) { 
    return document.documentElement[method] || document.body[method]; 
} 
getSize("scrollTop"); 
+0

क्रोम/सफारी/फ़ायरफ़ॉक्स और आईई 9 में अच्छी तरह से परीक्षण किया गया, धन्यवाद! – mkoistinen

20

या सिर्फ सरल रूप में:

var scrollTop = document.body.scrollTop || document.documentElement.scrollTop; 
+4

आईपैड और संभवतः अन्य डिवाइस/ब्राउज़रों (क्रोम?) पर काम नहीं करेगा, आपको वहां 'window.pageYOffset' की आवश्यकता होगी। – Yeti

+2

यह क्रॉस ब्राउज़र नहीं है। – Progo

+0

* मोबाइल * सफारी 5 और 7, फ़ायरफ़ॉक्स 31, क्रोम 37, ओपेरा 24, आईई 5-11 में मेरे लिए काम करता है। Http://www.quirksmode.org/dom/w3c_cssom.html#t35 के अनुसार यह * इतना * क्रॉस-ब्राउज़र है। इसलिए आपका धन्यवाद! Short'n'easy। – flu

1

मैं इसके लिए किया गया काफी देर जानते के बाद से इस सूत्र अद्यतन किया गया था, लेकिन यह एक समारोह मुझे लगता है कि डेवलपर्स के मूल तत्व को खोजने के लिए अनुमति देता है बनाया है कि वास्तव में मेजबान एक काम कर रहा है "scrollTop" संपत्ति। मैक ओएस एक्स (10.9 के लिए क्रोम 42 और फ़ायरफ़ॉक्स 37 पर परीक्षण किया गया।5):

function getScrollRoot(){ 
    var html = document.documentElement, body = document.body, 
     cacheTop = ((typeof window.pageYOffset !== "undefined") ? window.pageYOffset : null) || body.scrollTop || html.scrollTop, // cache the window's current scroll position 
     root; 

    html.scrollTop = body.scrollTop = cacheTop + (cacheTop > 0) ? -1 : 1; 
    // find root by checking which scrollTop has a value larger than the cache. 
    root = (html.scrollTop !== cacheTop) ? html : body; 

    root.scrollTop = cacheTop; // restore the window's scroll position to cached value 

    return root; // return the scrolling root element 
} 

// USAGE: when page is ready: create a global variable that calls this function. 

var scrollRoot = getScrollRoot(); 

scrollRoot.scrollTop = 10; // set the scroll position to 10 pixels from the top 
scrollRoot.scrollTop = 0; // set the scroll position to the top of the window 

मुझे आशा है कि आपको यह उपयोगी लगेगा! चीयर्स।

5

मैं window.scrollY || document.documentElement.scrollTop का उपयोग कर रहा हूं।

window.scrollY आईईएस को छोड़कर सभी ब्राउज़रों को शामिल करता है।
document.documentElement.scrollTop आईई शामिल हैं।

+2

पहली अभिव्यक्ति 'window.pageYOffset' भी हो सकती है। मैं इसका जिक्र करता हूं क्योंकि 'पेज वाई ऑफसेट' अधिक ऐतिहासिक लगता है, और मुझे अक्सर 'स्क्रॉल वाई' दिखाई नहीं देता है। एमडीएन के मुताबिक, वे वही हैं। किसी भी मामले में, यह अब तक का सबसे साफ और सबसे प्रत्यक्ष समाधान है, और इसे प्राथमिकता दी जानी चाहिए क्योंकि यह पहले आधुनिक ब्राउज़र को संबोधित करती है, इस प्रकार उन्हें अद्यतित होने के लिए दंडित नहीं किया जाता है। – Manngo

+1

@ जेसन: मेरा मतलब यह था कि मैं ऊपर दिए गए अपनी टिप्पणी के बजाय सबसे साफ और सबसे प्रत्यक्ष प्रश्न के उत्तर के बारे में बात कर रहा था। – Manngo

1

यह आईई 5 से IE11 तक अच्छी तरह से काम करता है। यह सभी प्रमुख नए ब्राउज़रों का भी समर्थन करता है।

var scrollTop = (document.documentElement && document.documentElement.scrollTop) || 
       (document.body.scrollTop) || (document.scrollingElement); 
संबंधित मुद्दे