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 相关文章推荐
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
Apr 10 Javascript
优化 JavaScript 代码的方法小结
Jul 16 Javascript
jQuery操作select的实例代码
Jun 14 Javascript
JS文本框不能输入空格验证方法
Mar 19 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
Apr 26 Javascript
浅谈JavaScript的内置对象和浏览器对象
Jun 03 Javascript
全面介绍javascript实用技巧及单竖杠
Jul 18 Javascript
JavaScript实现仿Clock ISO时钟
Jun 29 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 Javascript
微信小程序实现一个简单swiper代码实例
Dec 30 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
Aug 20 Javascript
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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
php阳历转农历优化版
2016/08/08 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
JQuery UI皮肤定制
2009/07/27 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
浅谈js的html元素的父节点,子节点
2016/08/06 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
浅谈python数据类型及类型转换
2017/12/18 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
Python 使用PIL中的resize进行缩放的实例讲解
2018/08/03 Python
python实现图片彩色转化为素描
2019/01/15 Python
详解opencv Python特征检测及K-最近邻匹配
2019/01/21 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
Python实现弹球小游戏
2020/08/01 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
2020/12/17 Python
农行实习自我鉴定
2013/09/22 职场文书
安全大检查反思材料
2014/01/31 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
公司新员工欢迎词
2015/09/30 职场文书
DE1103使用报告
2022/04/05 无线电
Nginx速查手册及常见问题
2022/04/07 Servers