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 相关文章推荐
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
简约JS日历控件 实例代码
Jul 12 Javascript
浅析Cookie中的Path与domain
Dec 18 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
Apr 25 Javascript
js实现大转盘抽奖游戏实例
Jun 24 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
Oct 19 Javascript
Vue.js 2.0中select级联下拉框实例
Mar 06 Javascript
详解Vue.js 2.0 如何使用axios
Apr 21 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
js中arguments对象的深入理解
May 14 Javascript
layui table 多行删除(id获取)的方法
Sep 12 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中使用Sockets 从Usenet中获取文件
2008/01/10 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
php创建、获取cookie及基础要点分析
2015/01/26 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
javascript jq 弹出层实例
2013/08/25 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
Jquery元素追加和删除的实现方法
2016/05/24 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
Python3中详解fabfile的编写
2018/06/24 Python
使用numba对Python运算加速的方法
2018/10/15 Python
python如何统计代码运行的时长
2019/07/24 Python
Python如何定义有默认参数的函数
2020/08/10 Python
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
PHP笔试题
2012/02/22 面试题
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
伦敦奥运会的口号
2014/06/21 职场文书
研究生求职自荐书
2014/06/23 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
教学督导岗位职责
2015/04/10 职场文书
教师读书活动心得体会
2016/01/14 职场文书
商业计划书范文
2019/04/24 职场文书