最近在檢測網(wǎng)頁異常情況俄精,添加了監(jiān)測的系統(tǒng)逗堵,跑了一段時間贸典,發(fā)現(xiàn)報錯最多的就是Cannot read 'scrollTop' of undefined
設(shè)備大多數(shù)基本上都是Android手機
檢查了一下代碼發(fā)現(xiàn),有用到scrollTop的時候只有在滾動加載的時,獲取頁面滾動的高度月趟,代碼如下
document.scrollingElement.scrollTop
只有這個地方用到了scrollTop,難道是scrollingElement
的問題恢口,于是查找了一些資料孝宗,如下
引用MDN文檔解釋Document.scrollingElement的作用
scrollingElement
(Document的只讀屬性)返回滾動文檔的Element
對象的引用。在標(biāo)準(zhǔn)模式下弧蝇,這是文檔的根元素碳褒,document.documentElement
當(dāng)在怪異模式下,scrollingElement
屬性返回HTMLbody
元素(若不存在返回null)
也就是說scrollingElement
在標(biāo)準(zhǔn)模式下可以被當(dāng)做文檔的根元素看疗,不過現(xiàn)在大部分網(wǎng)頁都是標(biāo)準(zhǔn)模式下沙峻。那接下來就看看兼容性問題。
scrollingElement 兼容性
PC端兼容性
手機端兼容性
看這兩張圖就能看出來两芳,兼容性并不是很好摔寨,Android并不支持此對象,所以在Android手機上會報錯怖辆。
那除了這元素是复,還有什么辦法獲取頁面內(nèi)容的滾動高度呢?
看過這個jsfiddle發(fā)現(xiàn)還可以使用document.body
和document.documentElement
的方式竖螃,我分別將這個jsfiddle在Chrome瀏覽器下運行淑廊,和在Safari下運行得到的結(jié)果卻不同,結(jié)果如下:
Chrome執(zhí)行結(jié)果
document.documentElement.scrollTop: 77
document.body.scrollTop: 0
document.scrollingElement.scrollTop: 77
Safari執(zhí)行結(jié)果
document.documentElement.scrollTop: 0
document.body.scrollTop: 77
document.scrollingElement.scrollTop: 77
對比結(jié)果就發(fā)現(xiàn)特咆,在Chrome中document.body.scrollTop獲取到的值為0季惩,而在Safari中是有值的,但document.documentElement.scrollTop卻沒有值得到0
兼容性解答方法獲取scrollTop
const scrollTop = Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop)
看了好多資料都說document.documentElement.scrollTop
已經(jīng)棄用腻格,但是Safari還是可以用的画拾,難道兼容了。更安全的寫法就是上面都兼容下
或者把scrollingElement也加上
function pageScrollTop {
if (document.scrollingElement) {
return document.scrollingElement.scrollTop
}
return Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop)
}
參考鏈接:
https://stackoverflow.com/questions/28633221/document-body-scrolltop-firefox-returns-0-only-js