返回列表 回复 发帖 ‹‹ 上一主题 | 下一主题 ››

JS中onclick与onmouseout冲突解决方案

JS中onclick与onmouseout冲突解决方案

故事背景:
前段时间,在百度需要做百度分享的时候,遇到一个问题,如下图:


百度分享-浮窗式代码获取页面



在红色区域中,当点击左侧的"-"号的时候,百度分享的浮动窗口top自减1,反之,当点击右侧的"+"号的时候,浮动窗口top自增1,如果按住就一直自增或自减。



引发问题:
一开始的时候认为这还不简单,使用一个onmousedown和onclick事件就能迎刃而解,谁知,使用了以后onclick与onmousedown冲突,因为onclick是由onmousedown和onmouseup组成的,所以当执行click的时候,mousedown和mouseup都被执行了,那么点击和按住就不好判断了,并且就算只当onmousedown就一直自增或自减,一旦click自增或自减可能就不是1个数字一个数字的网上自增了,可能点击一下,增加好多数值。所以需要判断按下鼠标0.5秒也就是500毫秒之前为click之后为按住,于是自然而然的会想到使用Date对象,等真正开发起来的时候问题来了,到底怎么计时呢?定义一个范围大点的变量,使onmouserup和onmousedown来判断时间?当onmousedown的时候开始计时,onmouseup的时候停止计时,然后根据这个时间去判断?结果肯定还是不行,因为咱们是按住后才自增自减,所以这样的话就必须释放鼠标,那么无论是从逻辑上还是用户体验都是不允许的,那这可怎么办呢?




新的思路:
思考了几分钟后发现其实只是用onmousedown和onmouseup这两个事件就能实现,没必要使用onclick的。您总共需要如下几样“工具”:
              onmousedown();
              onmouseup();
              setTimeout();

Step-1:
当onmousedown的时候使用直接使其自增或自减1像素;

Step-2:
在方法后使用setTimeout()来延时500毫秒按住所需要执行的代码;

Step-3:
在onmouseup()事件中执行清空setTimeout(),也就是clearTimeout();



思路分析:
当我们按下鼠标的时候也就执行了onmousedown()事件,肯定也会自动执行里面的自增1或自减1,如果我们在500毫秒内释放了鼠标,那么延时执行的代码便会被清除,自然也就不会执行了。当我们按住它的时候,如果超过500毫秒,那么就会执行setTimeout()方法中的延迟代码了,这样也就轻而易举的解决了onclick和onmousedown以及onmouseup之间的冲突了。
为了避免当鼠标按住按钮后,直接移出按钮的区域,导致代码一直自增或自减下去,那么可以分别在onmouseup和onmouseout事件中都执行clearTimeout();


代码案例:


  1. window.onclick = function()
  2. {
  3.         var leftBt = $("leftBt");
  4.         var rightBt = $("rightBt");
  5.         var flag = false;
  6.         /*以下为自减代码*/
  7.         leftBt.onmouseout = function(){clearTimeout(flag);}
  8.         leftBt.onmouseup = function(){clearTimeout(flag); }

  9.         leftBt.onmousedown = function()
  10.         {
  11.                 flag = setTimeout
  12.                 (
  13.                         function()
  14.                         {
  15.                                 /*此处为所需要执行的按住代码i++*/
  16.                         }, 500
  17.                 ); //延迟0.5秒执行按住的代码,也就是判断为按住
  18.                                 
  19.                 /*此处为执行0.5秒以内的click代码*/
  20.         }
  21.                
  22.               
  23.         /*以下为自增代码*/
  24.                
  25.         rightBt.onmouseout = function(){clearTimeout(flag);}
  26.         rightBt.onmouseup = function(){clearTimeout(flag);}

  27.         rightBt.onmousedown = function()
  28.         {
  29.                 flag = setTimeout
  30.                 (
  31.                         function()
  32.                         {
  33.                                 /*此处为所需要执行的按住代码i++*/
  34.                         }, 500
  35.                 ); //延迟0.5秒执行按住的代码,也就是判断为按住
  36.                                 
  37.                 /*此处为执行0.5秒以内的click代码*/
  38.         }
  39. }

  40. var $ = function(id){return document.getElementById(id);}
复制代码


大家看懂了可以写一个例子,然后回帖把代码以压缩包的方式上传上来,这样大家都更能彻底明白这种思路了。
如果大家还有什么新的思路,欢迎回帖讨论!


最后声明一下:如果你在百度分享官方查看代码返现一些不合理的布局和js混乱等问题,属于正常,因为开发这个项目已经有多个FE(Web前端开发工程师)接手,我是最后一个,结果大家的思路、逻辑都不一致所造成。而且百度分享所使用的一个自主开发的前端模版类库,所以导致页面中的script出现一些自定义属性与不符合W3C标准的代码,均属于正常。



转自:http://www.w3cfuns.com/forum.php?mod=viewthread&tid=1872
设计源微博 http://weibo.com/websjy

谢谢谢谢了.好东西大家分享
















-------------------------------------------------
  http://www.iyida.com/yanche.html

TOP

看帖子的要发表下看法












46314.com河北廊坊西木博士推荐的左旋肉

TOP

朋友们,您还在为家里装修要拉网线烦恼吗?还在忧愁每年交昂贵网费吗?还在苦恼出差无法上网吗?还在敢怒不敢言的公司、学校、宿舍限制上网吗?还在……? 用无线网卡吧。用了无线网卡,是不是又担心信号收不到,信号不稳定?没关系,用免费上网卡3800WG吧!免费上网卡BT21安装方便,笔记本电脑、3G上网本、台式机、平板电脑等,只要有USB接口就能使用。它接收能力超强,最远高达19公里超强信号,传输速率800Mbps(山寨货只有54Mbps或300Mbps,鄙视!),免费上网卡3800WG更是内置12核高性价芯片(山寨货只有单核或没有,鄙视!),让您上网速度尤如飞机般的快,运行速度更加稳定!如此超强网卡形同“天衣无缝”笼罩着整个区域,保证让您物超所值的感受!搭配强大破解工具,无论在农村、还是在山区都能随心所欲实现免费上网,保证让您永久免费上网成为现实!过年回家免费上网不再是奇迹!现买免费上网卡3800WG还可获赠TV棒(想看什么就看什么),绝对超值!
咨询热线:13424338789 在线**188735123  更多信息请上www.176hb.com

TOP

不是为楼主这样的标题所吸引,也不是被帖子的内容所迷惑。我不是来抢沙发的,也不是来打酱油的。我不是为楼主呐喊加油的,也不是对楼主进行围堵攻击的。我只是为了每天30帖默默奋斗。 你是个美女,我毫不关心;你是个怪兽,我决不在意;你是个帅哥,我不会妒忌;你是个畜男,我也不会PS。 你的情再怎么高尚,我也不会赞美;你的道德如何沦丧,我也不为所动。在这个处处都要回帖的时代,不得不弄个牛B的数字来显眼,于是我也抄下了这段话,专门用来回帖,好让我每天有固定的积分收入
www.qingdaogangchangyy.com

TOP

做个记号,下次好找!











仙逆 唐寅在异界

TOP

大量把您的产品信息群发到各大论坛网站上,被百度搜录的1条5角,没有被百度搜录的免费,先工作后付款QQ1354504632  代发4万论坛200元

TOP

知道了 不错~~~

TOP

不错的~~! 感谢您提供











官居一品

TOP

终于看完了~~~











通天之路 很纯很暧昧

TOP

返回列表 回复 发帖 ‹‹ 上一主题 | 下一主题 ››

站长推荐 关闭


亲弟弟竟然爬上了我的床??

我有一个弟弟,他小我两岁张的和我张的很像,当然这归功与我们的父母很有夫妻像,所以他们生下的一对子女也是如此的相象.   想想我的父母,对于他们或许我 ...


查看

本论坛已升级,此站将停止注册、发帖、回复!
10 秒钟将自动跳转到新站。

等不及了,直接点击

本站通用下载
帐号:test

密码:websjy