对于onscroll事件的支持

各浏览器 document、document.body、document.documentElement 对象的 onscroll 事件的支持存在差异。

所谓的支持性存在差异就是我们常说的浏览器兼容性问题,就是说,对于不同浏览器可能不会按照预期触发相应的事件处理函数。

  IE6 IE7 IE8 Firfox Chrome Safari Opera
  Q S Q S Q S Q S Q S Q S Q S
window 对象 Y Y Y Y Y Y Y Y Y Y Y Y Y Y
div 对象 Y Y Y Y Y Y Y Y Y Y Y Y Y Y
document 对象 N N N N N N Y Y Y Y Y Y N N
document.body 对象 Y N Y Y Y N N N N N N N Y Y
document.documentElement 对象 N Y N Y N Y N N N N N N N N

所有浏览器支持window对象和普通Div对象的scroll事件。但是要保证窗口或这是Div中出现滚动条才能触发滚动事件。

IE(S)不支持document对象scroll事件,对于如下代码,IE浏览器下不会有任何输出:

<script type="text/javascript">
window.onload = function() {
document.onscroll = function() {
document.getElementById("info").innerHTML = 'OK';
};
}
</script>
<div id="info" style="height:3000px;"></div>

支持性如下:

  IE6(S) IE8(S) Firefox Chrome Safari IE6(Q) IE7 IE8(Q) Opera
document.body.onscroll 无内容输出 OK

相反,IE浏览器支持document.documentElement对象scroll事件,而对于其他浏览器不会有任何输出:

<script type="text/javascript">
window.onload = function() {
document.documentElement.onscroll = function() {
document.getElementById("info").innerHTML = 'OK';
};
}
</script>
<div id="info" style="height:3000px;"></div>

支持性如下:

  IE6(S) IE7(S) IE8(S) IE6(Q) IE7 IE8(Q) Opera Firefox Chrome Safari
document.documentElement.onscroll OK 无内容输出

但是上述方法都需要浏览器窗口出现滚动条,如果浏览器内部div出现滚动条怎么办?

可以监听鼠标滚动事件:

不同浏览器有不同的滚轮事件,主要是两种,onmousewheel(ff不支持)和DOMMouseScroll(只有ff支持):

if(document.addEventListener){
document.addEventListener(‘DOMMouseScroll’,scrollFunc,false);
}//W3C
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome

判断鼠标上滑or下滑:

function scrollFunc(e){
e=e || window.event;
if(e.wheelDelta){//IE/Opera/Chrome
console.info(e.wheelDelta);
}else if(e.detail){//Firefox
console.info(e.detail);
}
}

如果为负数,则是下滑;如果是正数,则是上滑。

scrollTop,是已经滚动过的高度,scrollHeight是整个滚动的高度,

从开始到滚动结束 滚动过的高度,包括滚动元素自身的高度。

contentContainer的scrollTop为a,scrollHeight为b。

监听整个网页的滚动事件,正如上面所说的onscroll实现方法,但是要注意保持兼容性。

现在我们重温一下基础知识,很多时候,我们需要获取body视口高度:在保证完整的<!doctype...声明的前提下,获取body的视口高度为:document.documentElement.clientHeight;

对于要判断div时候滚动到底部,其实只需要判断div已经滚动的 过的距离scrollTop+自己本身的高度offsetHeight是否大于这个div本身的高度:

this.scrollTop+this.offsetHeight>=this.scrollHeight

判断body的滚动条是否滚动 到底部:

window.onscroll=function(){
var scrolltop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);
if(scrolltop+document.documentElement.clientHeight>=document.documentElement.scrollHeight)
alert( 'nowbottom' );
};

更多关于scrollTop的兼容性问题,可以查看:http://www.75team.com/archives/128

onsrcoll和scrollTop兼容与实现的更多相关文章

  1. input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has

    input屏蔽历史记录   设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处   ;(function($){$.ex ...

  2. 获取scrollTop兼容各浏览器的方法,以及body和documentElement

    1.各浏览器下 scrollTop的差异 IE6/7/8: 对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度 : 对于有do ...

  3. 【转】获取scrollTop兼容各浏览器的方法,以及body和documentElement是啥?

    1.各浏览器下 scrollTop的差异 IE6/7/8: 对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度 : 对于有do ...

  4. scrollTop兼容处理

    使用jQuery2.0以下版本的scrollTop()函数来设置当然兼容性当然很好,但有时需要为滚动设置滑动效果.比如,使用animate函数,这里需要做些兼容性处理: 实例:http://sandb ...

  5. 关于scrolltop 兼容 IE6/7/8, Safari,FF的方法

    1.各浏览器下 scrollTop的差异IE6/7/8:对于没有doctype声明的页面里可以使用  document.body.scrollTop 来获取 scrollTop高度 :对于有docty ...

  6. document.body.scrollTop与document.documentElement.scrollTop兼容

    这两天在写一个JS的网页右键菜单,在实现菜单定位的时候发现了这个问题:chrome居然不认识document.documentElement.scrollTop! 看前辈们的文章,纷纷表示如果有文档声 ...

  7. scrollTop兼容封装

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. scrollTop 值为 0

    由scrollTop兼容问题引起: 在 Firefox 和 IE 中,使用 document.documentElement.scrollTop 获取: 在 Chrome 中,使用 document. ...

  9. js,jQuery实现可关闭悬浮框广告特效,兼容(谷歌,火狐,Ie)

    注意不能直接用close()命名关闭广告函数,避免冲突. javascript实现方法: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

随机推荐

  1. 删除排序数组中的重复数字 II · Remove Duplicates from Sorted Array II

    重复一次 [抄题]: 给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. [思维问题]: [ ...

  2. 找不到reportviewer控件在哪儿

    請自行加入ReportViewer(9.0)到工具箱之中. 如下圖,

  3. google中guava类库:AsyncEventBus

    1.guava事件总线(AsyncEventBus)使用 1.1引入依赖 <dependency> <groupId>com.google.guava</groupId& ...

  4. CentOS设置yum存储库 (nginx)

    要为RHEL / CentOS设置yum存储库,请创建/etc/yum.repos.d/nginx.repo 使用以下内容命名的文件 : [nginx] name=nginx repo baseurl ...

  5. loadrunner--常用函数列表【转】

    1.        Intweb_reg_save_param("参数名","LB=左边界","RB=右边界",LAST);/注册函数,在参 ...

  6. Bootstrap验证

    <div class="modal fade" id="myModal" tabindex="-1" role="dialo ...

  7. 多线程的使用:只能用cmd来玩不能用idle

    from multiprocessing import Process import os def pro_do(name, func): print () if __name__ == " ...

  8. 网段;IP;广播地址;子网掩码;

    网段(network segment)一般指一个计算机网络中使用同一物理层设备(传输介质,中继器,集线器等)能够直接通讯的那一部分.例如,从192.168.0.1到192.168.255.255这之间 ...

  9. 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)

    传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...

  10. 37 The Benefits of Cutting Salt 减少盐分摄取量的益处

    The Benefits of Cutting Salt 减少盐分摄取量的益处 ①Just when you had figured out how to manage fat in your die ...