2013-12-11 38 views
17

中有所不同我試圖根據'document.documentElement.scrollTop'值處理一些代碼。它在FF和IE中返回'348',但在Chrome中返回'0'。我需要做任何事情來克服這個問題嗎?document.documentElement.scrollTop返回值在Chrome

FF:

​​

鉻:

document.documentElement.scrollTop 
0 
+1

嘗試'document.body.scrollTop' – Passerby

+0

感謝@Passerby ..有其他的,這個沒有其他解決辦法?如果沒有,我必須這樣去。 – RGR

+1

不是我所知道的......通常你可以使用'(document.documentElement.scrollTop || document.body.scrollTop)'。 – Passerby

回答

14

嘗試獲得滾動的這種

window.pageYOffset || document.documentElement.scrollTop 
+1

有趣的事實:這並不總是在Windows Phone中的WebView中工作。神祕的邊緣情況下,但我剛剛抨擊。這些數字有時是不同的,有時候強調,而pageYOffset在它們出現時似乎是錯誤的。 – Aaron

+0

document.body.scrollTop在Windows Phone上工作嗎? –

22

基於標準的方法是window.scrollY。這受Chrome,Firefox,Opera,Safari和IE Edge或更高版本的支持。如果你只支持這些瀏覽器,你應該去這個屬性。

IE> = 9支持類似的屬性window.pageYOffset,爲了兼容性返回與最近的瀏覽器中的window.scrollY相同的返回值,雖然它在某些時候可能會被棄用。

使用document.documentElement.scrollTopdocument.body.scrollTop的問題在於不需要在其中任何一個上定義滾動。例如,Chrome和Safari在<body>元素上定義它們的滾動,而Firefox在document.documentElement返回的<html>元素上定義它。這不是標準化的,並且可能在未來版本的瀏覽器中發生變化。但是,如果scrollYpageYOffset不存在,這是獲取滾動的唯一方法。

TL; DR:

window.scrollY || window.pageYOffset || document.body.scrollTop + (document.documentElement && document.documentElement.scrollTop || 0)

+0

返回chrome中的'NaN' 46 – Quamis

+0

在我的鉻合金47上正常工作...您的問題是否發生在任何特定網站或所有網站上? – jazmit

+0

@jazmit:這部分條件的用法是什麼document.body.scrollTop +(document.documentElement && document.documentElement.scrollTop || 0) –

1

你可以只使用如下因素代碼來修復錯誤!

let scrollHeight = document.body.scrollTop || document.documentElement.scrollTop; 
 
console.log(`scrollHeight = ${scrollHeight}`); 
 

 

 
/* 
 

 
this comment just using for testing the scroll height! 
 

 
but in this iframe it deon't work at all! 
 

 
So, you can try it out using Chrome console! 
 

 
*/

的document.body.scrollTop;
//適用於Chrome,Safari和Opera
document.documentElement.scrollTop;
//除非另有說明,否則Firefox和IE會將溢出置於該級別。
因此,我們使用documentElement屬性爲這兩個瀏覽器

參考鏈接:
http://www.w3schools.com/jsref/prop_element_scrolltop.asp

https://drafts.csswg.org/cssom-view/#dom-element-scrolltop

https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTop

0

使用window.scrollY如果可能的話,它的設計是在瀏覽器中保持一致。如果您需要支持IE,那麼我推薦以下只使用window.scrollY(如果可用):

typeof window.scrollY === "undefined" ? window.pageYOffset : window.scrollY 

window.scrollY將假評估,如果返回0,這樣window.scrollY || window.pageYOffset在技術上檢查window.pageYOffset每當window.scrollY人0,如果window.pageYOffset不等於0,則顯然不理想。

另外請注意,如果您需要像常見情況那樣頻繁地獲取滾動值(每幀/每次滾動),則可能需要檢查如果window.scrollY被預先定義。我喜歡使用我寫的這個小幫手函數來完成這個功能,並且使用​​- 它應該可以在IE10中工作。

function registerScrollHandler (callback) { 
    "use strict" 

    var useLegacyScroll = typeof window.scrollY === "undefined", 
     lastX = useLegacyScroll ? window.pageXOffset : window.scrollX, 
     lastY = useLegacyScroll ? window.pageYOffset : window.scrollY 

    function scrollHandler() { 
     // get the values using legacy scroll if we need to 
     var thisX = useLegacyScroll ? window.pageXOffset : window.scrollX, 
      thisY = useLegacyScroll ? window.pageYOffset : window.scrollY 

     // if either the X or Y scroll position changed 
     if (thisX !== lastX || thisY !== lastY) { 
      callback(thisX, thisY) 

      // save the new position 
      lastX = thisX 
      lastY = thisY 
     } 

     // check again on the next frame 
     window.requestAnimationFrame(scrollHandler) 
    } 

    scrollHandler() 
} 

使用這樣的功能:

registerScrollHandler(function (x, y) { 
    /* your code here :) */ 
    console.log("Scrolled the page", x, y) 
})