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 相关文章推荐
用正则获取指定路径文件的名称
Feb 27 Javascript
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
javascript数组去掉重复
May 12 Javascript
理清apply(),call()的区别和关系
Aug 14 Javascript
JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式)
Aug 04 Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 Javascript
JS实现Ajax的方法分析
Dec 20 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
vue引用js文件的多种方式(推荐)
May 17 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
如何基于vue-cli3.0构建功能完善的移动端架子
Apr 24 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
PHP分页显示制作详细讲解
2008/11/19 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
JavaScript中的style.display属性操作
2013/03/27 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
js中日期的加减法
2015/05/06 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
JSON与js对象序列化实例详解
2017/03/16 Javascript
jQuery实现简单的计时器功能实例分析
2017/08/29 jQuery
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
python的类方法和静态方法
2014/12/13 Python
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
django的ORM模型的实现原理
2019/03/04 Python
py-charm延长试用期限实例
2019/12/22 Python
keras 读取多标签图像数据方式
2020/06/12 Python
联想英国官网:Lenovo英国
2019/07/17 全球购物
Linux内核产生并发的原因
2012/07/13 面试题
生物专业个人自荐信范文
2013/11/29 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
员工年终考核评语
2014/12/31 职场文书
任命书怎么写
2015/03/02 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
教师求职自荐信
2015/03/26 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers