[JS]鼠标事件穿透的问题

时间:2023-02-18 22:55:08

今天制作登陆窗口的效果时碰到的一个问题,如下:

[JS]鼠标事件穿透的问题

标签结构如下:

<div id="loginFrame">
<form class="loginFrame-top" method="POST" action="#">
<h3>商户卖家登陆</h3>
<h6>请使用卖家账户可登录后进入店铺或申请开店</h6>
<dl>
<dt><label for="account">商家账号:</label></dt>
<dd><input type="text" name="account" id="account"></dd>
</dl>
<dl>
<dt><label for="password">登陆密码:</label></dt>
<dd><input type="password" name="password" id="password"></dd>
</dl>
<dl>
<dt><label for="checkCode">验&nbsp;&nbsp;证&nbsp;&nbsp;码:</label></dt>
<dd><input type="text" name="checkCode" id="checkCode"><img id="codeImg" src="data:images/code.jpg"><a id="updateCode" href="#">看不清,换一张</a></dd>
</dl>
<input type="submit" value="确认登陆">
</form>
<p class="loginFrame-bottom">还没有成为我们的合作伙伴?<a href="#">快速注册</a></p>
</div>

刚开始准备不使用js处理,直接用css来制作这个效果,但最终效果如上面的动图,有点问题,css样式如下:

#loginFrame{
width: 20%;
height: 300px;
border: 1px solid red;
margin-top: -500px;
margin-left: 60%;
}
#loginFrame>.loginFrame-top{
display: table;
width: 100%;
background-color: rgba(255,255,255,0.9);
padding-top: 20px;
}
#loginFrame>.loginFrame-top>h3{
text-align: center;
margin-bottom: 10px;
}
#loginFrame>.loginFrame-top>h6{
text-align: center;
margin-bottom: 20px;
color: #999999;
}
#loginFrame>.loginFrame-top>dl{
width: 80%;
margin-left: auto;
margin-right: auto;
height: 40px;
background-color: rgba(255, 255, 255, 0.95);
border: 1px solid #cecece;
box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1) inset;
}
#loginFrame>.loginFrame-top>dl>dt{
float: left;
width: 20%;
height: 40px;
margin-left: 2%;
}
#loginFrame>.loginFrame-top>dl>dt>label{
line-height: 40px;
height: 40px;
width: 100%;
}
#loginFrame>.loginFrame-top>dl>dd{
float: left;
width: 76%;
height: 40px;
margin-left: 2%;
}
#loginFrame>.loginFrame-top>dl>dd>input{
background-color: rgba(0, 0, 0, 0);
border-style: none;
font-size: 12px;
height: 40px;
line-height: 40px;
width: 100%;
}
/*验证码输入栏特殊处理*/
#loginFrame>.loginFrame-top>dl:nth-of-type(3)>dd>input{
width: 55%;
}
#loginFrame>.loginFrame-top>dl:nth-of-type(3)>dd>input+img{
width: 45%;
height: 40px;
}
/*此处css实现效果不理想(点击不了链接),使用js代替*/
/*#loginFrame>.loginFrame-top>dl:nth-of-type(3)>dd>input+img:hover+a{
display: inline-block;
}*/
#loginFrame>.loginFrame-top>dl:nth-of-type(3)>dd>a{
display: none;
margin-left: -45%;
width: 45%;
height: 40px;
line-height: 40px;
background-color: rgba(0, 0, 0, 0.5);
color: #fff;
font-size: 12px;
text-align: center;
text-decoration: none;
}
.loginFrame-bottom{
width: 100%;
height: 40px;
line-height: 40px;
text-align: center;
background-color: rgba(0,0,0,0.5);
}

于是准备使用js来处理,修改如下:

<img id="codeImg" onmouseover="isHover()" onmouseout="isOut()" src="data:images/code.jpg">
function isHover(){
var updateCode= document.getElementById("updateCode");
updateCode.style.display="inline-block";
var codeImg= document.getElementById("codeImg");
//展开遮罩层后清除鼠标事件(或许清除的使用方式不正确)
codeImg.onmouseover="";
}
function isOut(){
var updateCode= document.getElementById("updateCode");
updateCode.style.display="none";
var codeImg= document.getElementById("codeImg");
//隐藏遮罩层后开启鼠标事件(或许开启的使用方式不正确)
codeImg.onmouseover="isHover()";
}

但修改过的实际效果总是与想象的不一样,鼠标悬浮时并没有按理想中的去展现遮罩层,这个事件看起来好像都没执行(原生js不是很熟悉,可能是用法上有误),看来还是不行,再去网上各种找答案,最终找到css的一个属性pointer-events(设置或检索在何时成为属性事件的target),修改css如下:

/*此处css实现效果不理想(点击不了链接),使用js代替*/
/*#loginFrame>.loginFrame-top>dl:nth-of-type(3)>dd>input+img:hover+a{
display: inline-block;
pointer-events:none;
}*/

这样的效果实现的很完美,但是也导致a标签无法点击,这样的话我就没法去根据a标签的点击去向后台发送请求了,思前想后,我居然为了找个完善的解决方法花费了将近三个小时,但很遗憾并没有找到我想要的完美的解决方法,我们分析一下导致这种问题的原因:当我们鼠标悬浮在图片上时触发了悬浮事件(此事件中打开了遮罩层),遮罩层遮挡了图片的悬浮事件区域,导致图片的鼠标移出区域事件触发(此事件隐藏了遮罩层),遮罩层的消失却又触发了图片的悬浮事件,于是开始了事件循环,问题就是这样出现的。那该怎么解决呢?如果只给图片一个悬浮事件(触发时展开a标签遮罩层),另外给a标签一个鼠标移出事件(触发时隐藏它自己),把事件的触发分离,是否解决呢?修改后的代码:

        <img id="codeImg" onmouseover="isHover()" src="data:images/code.jpg"><a id="updateCode" onmouseout="isOut()" href="#">看不清,换一张</a>
function isHover(){
var updateCode= document.getElementById("updateCode");
updateCode.style.display="inline-block";
}
function isOut(){
var updateCode= document.getElementById("updateCode");
updateCode.style.display="none";
}

是的,问题解决了,貌似是很完善的一个解决方法,但感觉好像应该有更自然一些的解决方法,应该是我没找到,那就这样吧。

最终效果:

[JS]鼠标事件穿透的问题

[JS]鼠标事件穿透的问题的更多相关文章

  1. js 鼠标事件的抓取代码

    js 鼠标事件的抓取代码,分享给大家. 1.通过ele.setCapture();设置鼠标事件的抓取. 2,应用可以通过单.双击文字来获取时间. <html> <head> & ...

  2. 史上最全的CSS hack方式一览 jQuery 图片轮播的代码分离 JQuery中的动画 C&num;中Trim&lpar;&rpar;、TrimStart&lpar;&rpar;、TrimEnd&lpar;&rpar;的用法 marquee 标签的使用详情 js鼠标事件 js添加遮罩层 页面上通过地址栏传值时出现乱码的两种解决方法 ref和out的区别在c&num;中 总结

    史上最全的CSS hack方式一览 2013年09月28日 15:57:08 阅读数:175473 做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我 ...

  3. js鼠标事件相关知识

    1.mousedown->mouseup依次触发后相当于click事件 2.除了mouseenter和mouseleave外,其它的鼠标事件都是冒泡的 3.mouseover和mouseout事 ...

  4. JS鼠标事件大全 推荐收藏

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  5. js鼠标事件大全

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  6. JS 鼠标事件大全

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  7. js鼠标事件

    今天遇到一个非常奇怪而又搞笑的事情:给一个a标签添加一个鼠标移动上时给一个事件,我给其添加的是一个onMouseMove事件,结果在IE6 7 8 9和GOOLE中都很正常,结果在Firox中出现问题 ...

  8. js 鼠标事件详细

    常用的几个类型 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick HT ...

  9. js鼠标事件、键盘事件实例代码

    讲述了:鼠标的哪个按键被点击.当前鼠标的光标坐标是多少.被按下键的unicode码是多少.当前鼠标的光标相对于屏幕的坐标是多少.当前鼠标的光标坐标是多少.shift键是否按下.当前被点击的是哪一个元素 ...

随机推荐

  1. MacOS平台下&commat;rpath在动态链接库中的应用

    一.背景介绍 公司开发的一个底层库被用在了Mac平台的多个产品中.在开发这个底层库的初期,对于Mac OSX下的Install name 并没有过多的了解.对于XCode中的install name项 ...

  2. JS操作Unicode编码的emoji表情显示在页面

    前言:项目中用到了emoji表情,后端传递数据时直接是以Unicode形式,在页面总是无法展示,找尽各种方法总算是试出了一种,虽然达到效果但是并不是特别理解其中的原理并且无比笨拙,贴在这用作笔记,如果 ...

  3. 7&period;1WebApi2的异常处理

    这篇文章描述错误和异常处理在 ASP.NET Web API. HttpResponseException 如果 Web API 控制器引发未捕获的异常,会发生什么?默认情况下,大多数异常被转译为 H ...

  4. Linux下Nagios的安装与配置&lbrack;转&rsqb;

    一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报 ...

  5. javaBean的使用方法;

    在jsp页面中使用javaBean:三个标签: <jsp:useBean>标签 <jsp:setProperty>标签 <jsp:getProperty>标签 首先 ...

  6. 【转】ViewGroup的onMeasure和onLayout分析

    ViewGroup的onMeasure和onLayout分析 一个Viewgroup基本的继承类格式如下: 1 import android.content.Context; 2 import and ...

  7. IntellijIDEA 使用技巧

    1:显示工具栏目  toolbar:view ->ToolBar 2:加载源码   new project ->选择java project ->选择源码所在目录 ->ok

  8. 【转】Maven实战(五)---两个war包的调用

    原博文出自于: http://blog.csdn.net/liutengteng130/article/details/42879803    感谢! 开篇前提   1.为什么要用两个war包的调用? ...

  9. 【HDOJ】1003 Max Sum

    最开始使用递归DP解,stack overflow.化简了一些,复杂度为O(n)就过了. #include <stdio.h> int main() { int case_n, n; in ...

  10. 微信小程序demo豆瓣图书

    最近微信小程序被炒得很火热,本人也抱着试一试的态度下载了微信web开发者工具,开发工具比较简洁,功能相对比较少,个性化设置也没有.了解完开发工具之后,顺便看了一下小程序的官方开发文档,大概了解了小程序 ...