JS无法捕获滚动条上的mouse up事件的原因猜想


Posted in Javascript onMarch 21, 2012

比如一个网页的聊天室,滚动条会随着内容的增加自动往下滚动。
当用户鼠标在滚动条上按下的时候,我们可以假设他(她)正在浏览聊天内容,那么这个时候好的用户体验就不能让滚动条再自动滚动了。
为了实现这个功能,可能大家首先会想到的就是mouse down 和 mouse up事件了。
可是具体实现的时候我们会发现在滚动条上按下鼠标左键再松开的时候,捕获不到mouse up了。如下面例子

<html> 
<head> 
<title></title> 
<script type="text/javascript"> 
var captureTarget = null; 
function down(obj, e) { 
captureTarget = obj; 
// 如果是IE可以打开注释 
// captureTarget.setCapture(); 
e = e ? e : window.event; 
} 
function up(obj,e) { 
// if (captureTarget) 
// captureTarget.releaseCapture(); 
e = e ? e : window.event; 
div2.innerText = e.srcElement.tagName; 
} 
document.addListener = function(event, callback) { 
if (!document.all) 
this.addEventListener(event, callback); 
else 
this.attachEvent("on"+event, callback); 
} 
document.addListener("mouseup", function(){alert(1);}); 
</script> 
</head> 
<body > 
<div style="width:200px;height:200px;overflow:scroll" onmousedown="down(this, event);"> 
<div style="height:500px; width:500px"></div> 
</div> 
</body> 
</html>

保存为html格式文件,浏览器打开,然后在滚动条上左键点击试试,再在其他地方点击试试。
由于没有深入研究过W3C的文档,这里只能猜想。
考虑到滚动条的特性,可能浏览器在鼠标按下滚动条的时候给滚动条setCapture了,而鼠标松开之后给他releaseCapture,滚动条又不属于Dom对象,所以在鼠标释放之前无法捕获mouseup事件。
Javascript 相关文章推荐
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
Mar 30 Javascript
拖动table标题实现改变td的大小(css+js代码)
Apr 16 Javascript
jquery中map函数遍历数组用法实例
May 18 Javascript
Node.js实用代码段之正确拼接Buffer
Mar 17 Javascript
浅谈AngularJs指令之scope属性详解
Oct 24 Javascript
使用JavaScript实现alert的实例代码
Jul 06 Javascript
vue cli 3.0 使用全过程解析
Jun 14 Javascript
[原创]微信小程序获取网络类型的方法示例
Mar 01 Javascript
Vue程序调试的方法
Jun 17 Javascript
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
JS防抖和节流实例解析
Sep 24 Javascript
我所理解的JavaScript中的this指向
Sep 04 Javascript
js对象关系图 方便dom操作
Mar 18 #Javascript
再谈javascript面向对象编程
Mar 18 #Javascript
一个简单的Ext.XTemplate的实例代码
Mar 18 #Javascript
Javascript 面向对象编程(coolshell)
Mar 18 #Javascript
Javascript面向对象编程
Mar 18 #Javascript
javascript 常用功能总结
Mar 18 #Javascript
Jquery实现简单的动画效果代码
Mar 18 #Javascript
You might like
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
xtree.js 代码
2007/03/13 Javascript
JavaScript CSS 修改学习第四章 透明度设置
2010/02/19 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
js document.write()使用介绍
2014/02/21 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
Vue触发隐藏input file的方法实例详解
2019/08/14 Javascript
Python模拟用户登录验证
2017/09/11 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
详解Python用户登录接口的方法
2019/04/17 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
Python学习笔记之装饰器
2020/08/06 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
公司员工辞职信范文
2015/05/12 职场文书
2015年社区国庆节活动总结
2015/07/30 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python