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 相关文章推荐
改善用户体验的五款jQuery插件分享
May 22 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
Dec 23 Javascript
jquery删除提示框弹出是否删除对话框
Jan 07 Javascript
js获取下拉列表框中的value和text的值示例代码
Jan 11 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
基于jQuery实现返回顶部实例代码
Jan 01 Javascript
JavaScript实现下拉菜单的显示和隐藏
Jan 05 Javascript
Bootstrap每天必学之附加导航(Affix)插件
Apr 25 Javascript
微信小程序 特效菜单抽屉效果实例代码
Jan 11 Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 Javascript
React Hooks的深入理解与使用
Nov 12 Javascript
在vue中根据光标的显示与消失实现下拉列表
Sep 29 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
关于手调机和数调机的选择
2021/03/02 无线电
简化php模板页面中分页代码的解析
2009/02/06 PHP
PHP基础知识介绍
2013/09/17 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
javascript中如何处理引号编码&amp;#034;
2013/08/15 Javascript
js实现iframe跨页面调用函数的方法
2014/12/13 Javascript
深入理解JavaScript系列(45):代码复用模式(避免篇)详解
2015/03/04 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
loading动画特效小结
2017/01/22 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python实用日期时间处理方法汇总
2015/05/09 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
DataFrame中去除指定列为空的行方法
2018/04/08 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python tkinter三种布局实例详解
2020/01/06 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
.NET常见笔试题集
2012/12/01 面试题
美德好少年事迹材料
2014/01/19 职场文书
高中综合实践活动总结
2014/07/07 职场文书
入党介绍人意见2015
2015/06/01 职场文书
地雷战观后感
2015/06/09 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js
redis lua限流算法实现示例
2022/07/15 Redis