javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element


Posted in Javascript onJanuary 05, 2010

因为在JavaScript中,mousedown、mouseup、click执行顺序是从左到右的,更重要的是一旦mousedown事件激活,正常情况(不在mousedown事件中绑定的方法使用alert类似方法,因为弹出对象框就阻止了事件传递,即后续调用事件丢失)下后面两个事件也肯定会被激活。平时我们在一个标签上只绑定一个click事件,其实触发click事件也都调用了mousedown、mouseup等事件,只是它们调用周期极短,而且我们又没有编写相关函数与这两个事件绑定,所以不会觉察到。现在假设你要在一个标签上同时注册这几个事件,并具绑定指定的处理函数,在实际开发中,你将会遇到我下面提及的问题。
先通过一个简单例子测试并发现我说的问题,让你有个直观的印象,再接着看我的解决办法。

<div id="div1" onmousedown="mouseDownFun();" onmouseup="mouseUpFun();" onclick="clickFun();" style="background:#CCC; border:3px solid #999; width:200px; height:200px; padding:10px"></div> 
<input style="margin-top:10px" type="button" onclick="document.getElementById('div1').innerHTML='';" value="清除信息" /> 
<script type="text/javascript"> 
function mouseDownFun() 
{ 
document.getElementById('div1').innerHTML += 'mouseDown<br/>'; 
} 
function mouseUpFun() 
{ 
document.getElementById('div1').innerHTML += 'mouseUp<br/>'; 
} 
function clickFun() 
{ 
document.getElementById('div1').innerHTML += 'click<br/>'; 
} 
</script>

现在假设有这样一个需求:在一张图片上按下mousedown开始拖动这张图片,而在这张图片上发生mouseup鼠标释放就显示这张图片的相关信息。正常情况下要想mouseup绑定的函数执行,那么mousedown绑定的函数也执行了,而且还是先执行的,也就是说在你查看图片信息的时候,图片也在拖动中。其实你正真希望的可能是每次执行其中一个方法就好了,比如当你按下鼠标并很快就释放掉时,其实你是想看图片信息,而不是想拖动图片;相反,如果你按下鼠标并停顿了一下,表明你是想准备拖动图片,这时候查看信息方法不要执行。这怎么做到的呢,根据上面的分析,我发现可以用setTimeout函数来加以处理实现这样的需求(当然,如果你有发现更好的解决办法,一定要记得与我分享,哈)。下面给出完整例子,很简单,也加了注释,不另外解释了:
<div id="div1" onmousedown="mouseDownFun();" onmouseup="mouseUpFun();" style="background:#CCC; border:3px solid #999; width:200px; height:200px; padding:10px"></div> 
<input style="margin-top:10px" type="button" onclick="document.getElementById('div1').innerHTML='';" value="清除信息" /> 
<script type="text/javascript"> 
var doMouseDownTimmer = null; 
var isMouseDownDoing = false; 
function mouseDownFun() 
{ 
//因为mouseDownFun每次都会调用的,在这里重新初始化这个变量 
isMouseDownDoing = false; 
//延迟200毫秒才调用onmousedown真正的处理代码,如果在200毫秒内就释放鼠标,把 doMouseDownTimmer清除,那么onmousedown即使调用了,其实是没有调用到doMouseDown函数作为 onmousedown真正要处理的代码 
doMouseDownTimmer = setTimeout(doMouseDown,200); 
} 
function doMouseDown() 
{ 
//如果200毫秒后调用了这个方法,把isMouseDownDoing设置成true,表明发生了mouseDown实际处理,此后mouseUp就不要处理了 
isMouseDownDoing = true; 
document.getElementById('div1').innerHTML += 'mouseDown<br/>'; 
} 
function mouseUpFun() 
{ 
if (!isMouseDownDoing) 
{ 
clearTimeout(doMouseDownTimmer); //能进到这里来,不管三七二十一先把doMouseDownTimmer清除,不然200毫秒后doMouseDown方法还是会被调用的 
document.getElementById('div1').innerHTML += 'mouseUp<br/>'; 
} 
} 
</script>

相关话题:因为平时经常用的click事件都跑在mousedown、mouseup之后,我们可以用mouseup代替click(上面的例子就是这样用的),此时Element上就不要再注册click事件。当然,可以的话,还可以直接拿mousedown代替click,事件响应将更快,其中在Google的一些产品中有看到这样的写法,比如Gmail。
Javascript 相关文章推荐
JavaScript 对象、函数和继承
Jul 07 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
Sep 30 Javascript
js 对小数加法精度处理示例说明
Dec 27 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
js通过iframe加载外部网页的实现代码
Apr 05 Javascript
VueJS事件处理器v-on的使用方法
Sep 27 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
JavaScript指定断点操作实例教程
Sep 18 Javascript
如何使用VuePress搭建一个类型element ui文档
Feb 14 Javascript
微信小程序实现的canvas合成图片功能示例
May 03 Javascript
vue中使用vue-print.js实现多页打印
Mar 05 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
jQuery 数据缓存data(name, value)详解及实现
Jan 04 #Javascript
用AJAX返回HTML片段中的JavaScript脚本
Jan 04 #Javascript
Javascript解决常见浏览器兼容问题的12种方法
Jan 04 #Javascript
javascript 模拟点击广告
Jan 02 #Javascript
javascript 多种搜索引擎集成的页面实现代码
Jan 02 #Javascript
让firefox支持IE的一些方法的javascript扩展函数代码
Jan 02 #Javascript
javascript getElementsByClassName 和js取地址栏参数
Jan 02 #Javascript
You might like
PHP中的正规表达式(二)
2006/10/09 PHP
PHP同时连接多个mysql数据库示例代码
2014/03/17 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JS获取当前网页大小以及屏幕分辨率等
2014/09/05 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
python client使用http post 到server端的代码
2013/02/10 Python
python处理cookie详解
2014/02/07 Python
跟老齐学Python之数据类型总结
2014/09/24 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python interpolate插值实例
2020/07/06 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
幼儿教师求职信
2014/05/24 职场文书
常住证明范本
2015/06/23 职场文书
立案决定书范文
2015/06/24 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python