为了检查我以前用jQuery包装window
对象的页面的滚动值,但是在滚动时,滚动事件的目标元素将成为document
对象:
$(window).scroll(function(e) {
alert('Scrolling ' + e.target);
});
要包装以检查滚动值的正确对象是什么?
我知道它们之间的区别(一个窗口可以包含多个框架,因此可以包含许多文档),但是对于单个文档上下文,我看到滚动值一致:
alert($(window).scrollTop() === $(document).scrollTop());
编辑:
原生JavaScript也会发生这种情况:
window.onscroll = function(e) { alert('scrolled ' + e.target); };
绑定的元素是
window
,但事件目标是document
。关于上面的表达式,将
window
对象的scrollTop值与document
对象之一进行比较:jQuery文档说明$(window).width()
返回视口的宽度,而$(document).width()
返回视口的宽度。 HTML DOM元素;由于视口可能小于整个HTML元素的宽度,因此这两个值可能会有所不同。 最佳答案
暂时将jQuery放在一旁,您可以使用普通的JavaScript检查当前垂直滚动位置的window
的以下属性:
window.pageYOffset;
window.scrollY;
第二个不是跨浏览器according to MDN。仍然根据该说明,在IE document.body.scrollTop,因为
window
的任何属性都不会为您提供当前滚动位置。实际上,document.body.scrollTop
是我最常使用的,因为根据我的经验,它只是跨浏览器工作(此处需要引用和检查)。jQuery考虑了浏览器的差异,无论您为
.scrollTop()
使用哪个选择器(请查看source code),都可以从正确的对象获取正确的属性。简而言之,在要求window
时,是使用jQuery选择document
还是.scrollTop()
都没有关系。它将查找window.pageYOffset
,如果找不到它,它将返回document.body.scrollTop
。关于每个窗口对多个文档的注释的注释:从技术上讲,每个
window
对象仅指向单个document
,反之亦然。如果有多个框架,则每个框架都有单独的window
和document
元素。例如,如果您获得对单个iframe的引用,则可以从中获取其自己的window
和document
:// first iframe in main document
var ifr = document.getElementsByTagName('iframe')[0];
var ifrWindow = ifr.contentWindow;
var ifrDocument = ifrWindow.document;
// The above is good for new and old browsers;
// ifr.contentDocument is also available on modern browsers