消除mouseover或mouseout重复触发事件

    通常会在商品的展示图,设置一些鼠标悬浮事件。当鼠标悬浮在商品图片时,会触发一些时间,出现商品信息框或则商品图片发生变化,当鼠标离开商品图片时,图片恢复原状。最近在做类似的事情,由于不能使用就Query,(微笑不能用jQuery,我也很无奈。。)于是自己写了原生的JS来实现一些mouseover和mouseout事件,但是,测试时发现了一些问题。

商品的展示图的HTM代码如下所示:

<div class="goodsItem">
  <a href="goods.php?id=72" class="img-box"><img src="#" alt="智能相机" class="goodsimg" /></a>
  <div class="goods-info">
       <div class="goods-title"><a href="#" title="智能相机">智能相机</a></div>
       <div class="goods-ms">12345678910</div>
       <div class="clearfix price-box">
       <div class="shop_s">¥149元</div>
       <a class="price-btn" href="goods.php?id=72">立即购买</a>
   </div>
</div>


增加样式后,实现的效果如下所示:




布局搞好后,准备添加些鼠标悬浮事件。我大概想这样做,当鼠标悬浮商品图片时,商品信息(绿色框框)会出现,大概如下所示:



一开始写的代码大概如下所示:

	for(var i=0;i<goodsImg.length;i++)
	{
		goodsImg[i].onmouseover = function(ev)
		{
		  //此处省去
		};
		goodsImg[i].onmouseout = function(ev)
		{
			
                 //此处省去
 };}

    本来以为万事大吉,一切OK。当我测试时发现,当鼠标在图片上悬浮时虽然是可以出现信息框框,但是,当鼠标不停在图片上滑动时(鼠标没有离开图片范围),信息框框会不断重复消失又出现,出现又消失(即不断触发事件)。我要的是,当鼠标悬浮图片时(鼠标没有离开图片),只要触发一次事件就可以了。
网上找了一些资料,最终解决这个问题。可以参考 http://www.softwhy.com/forum.php?mod=viewthread&tid=10649

     解决后的代码如下所示:

for(var i=0;i<goodsImg.length;i++)
	{
		
		goodsImg[i].onmouseover = function(ev)
		{
			var ev=ev||window.event;
                        if(!isMouseLeaveOrEnter(ev,this)){return false;}
			
			//此处省去
		};
		goodsImg[i].onmouseout = function(ev)
		{
			var ev=ev||window.event;
                        if(!isMouseLeaveOrEnter(ev,this)){return false;}
                        //此处省去
		};
		
		
	}
 //消除onmouseover和onmouseout重复执行,这是关键代码
  function isMouseLeaveOrEnter(e, handler) {    
        if (e.type != 'mouseout' && e.type != 'mouseover') return false;    
         var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;    
         while (reltg && reltg != handler)    
            reltg = reltg.parentNode;    
         return (reltg != handler);    
     } 

    本文纯属作为笔记记录。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在HTML中,mouseenter、mouseleave、mouseovermouseout是鼠标事件的几种类型。它们之间的区别在于子元素的触发方式。mouseenter事件不支持事件冒泡,因此当鼠标进入或离开一个元素的子元素时,不会触发mouseenter和mouseleave事件,而是触发mouseovermouseout事件。\[1\]引用\[2\]:要模拟mouseenter事件,可以使用mouseover事件来代替。因为mouseover事件在鼠标进入元素时会触发,而且不会受到子元素的影响。\[2\]引用\[3\]:在Vue.js中,可以使用@mouseenter、@mouseleave、@mouseover和@mouseout来绑定相应的事件处理函数。@mouseenter事件在鼠标进入元素时触发,@mouseleave事件在鼠标离开元素时触发,@mouseover事件在鼠标在元素上方移动时触发,@mouseout事件在鼠标离开元素时触发。\[3\] 所以,如果你想模拟mouseenter事件,可以使用@mouseover来代替。同样地,如果你想模拟mouseleave事件,可以使用@mouseout来代替。而@mouseover事件和@mouseout事件则可以直接使用。 #### 引用[.reference_title] - *1* *2* [js中鼠标事件mouseover、mouseenter和mouseleave、mouseout的区别](https://blog.csdn.net/JackieDYH/article/details/117234168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Vue实现鼠标悬浮隐藏与显示图片效果 @mouseenter 和 @mouseleave事件](https://blog.csdn.net/Life_s/article/details/126770960)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值