模拟QQ软件中的弹出提示框功能,制作一个简易的延时提示框。
功能实现:
1、当鼠标移入指定区块时,弹出隐藏的区块;当鼠标移出指定区块时,弹出的隐藏区块再次隐藏。
2、同时要求在鼠标移入该弹出区块后,区块继续保持显示状态,在鼠标移出弹出区块后,弹出的隐藏区块再次隐藏。
主要应用知识:setTimeout()函数、clearTimeout()以及连等应用。

初始的HTML代码:

<div id="div1" ></div>
<div id="div2" ></div>

  

以及相应的内置样式表:
div{
float:left;
margin:10px;
}
#div1{
width:50px;
height:50px;
background:red;
}
#div2{
width:250px;
height:180px;
background:#ccc;
display:none;
}

  

构建一个window.onload函数,所有JS代码均在该函数内。同时获取相应的div元素。

window.onload=function()
{
var oDiv1=document.getElementById("div1");
var oDiv2=document.getElementById("div2");
};

  

设计目标:[当鼠标移入指定区块时,弹出隐藏的区块;当鼠标移出指定区块时,弹出的隐藏区块再次隐藏。]
初步编写JavaScript函数代码:

     oDiv1.onmouseover=function()
{
oDiv2.style.display="block";
}
//当鼠标移入oDiv1时,oDiv2显示
oDiv1.onmouseout=function()
{
oDiv2.style.display="none";
}
//当鼠标移出oDiv1时,oDiv2消失
设计目标:[在鼠标移入该弹出区块后,区块继续保持显示状态,在鼠标移出弹出区块后,弹出的隐藏区块再次隐藏。]
初步编写JavaScript函数代码:

    oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
}
//当鼠标移入oDiv2时,oDiv2显示
oDiv2.onmouseout=function()
{
oDiv2.style.display="none";
}
//当鼠标移出oDiv2时,oDiv2消失

在浏览器中运行该代码发现问题:鼠标一旦离开oDiv1,即触发oDiv1.onmouseout这行代码执行,导致oDiv2区块display="none";,鼠标无法移到oDiv2上面。后续设计目标无法实现。setTimeout()函数用于解决这个问题,即在鼠标移出oDiv1后,需要令oDiv2继续显示一段时间,以供鼠标移入。
因此代码需要进行如下更改:

oDiv1.onmouseout=function()
{
oDiv2.style.display="none";
}
//当鼠标移出oDiv1时,oDiv2消失

更改为

oDiv1.onmouseout=function()
{
setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}
//在鼠标移出oDiv1时,通过setTimeout()令oDiv2延迟0.5s消失
在浏览器中运行代码后发现问题:尽管通过setTimeout()令鼠标在移出oDiv1后oDiv2可以显示一段时间,但是鼠标移入oDiv2后,oDiv2仍然消失了。这是由于定时器的设置oDiv2.style.display="none";在0.5s后生效。
但是明明写了鼠标移入oDiv2后,区块显示的代码啊:
oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
}
//当鼠标移入oDiv2时,oDiv2显示
再次尝试,发现问题仍然存在。这里setTimeout()中对于oDiv2的display设置代码优先级高于后添加的这段代码。逻辑:只有setTimeout()的代码正确执行,才能有触发oDiv2.onmouseover的条件。setTimeout()的中的代码是oDiv2.onmouseover中的代码执行的先决条件,两者冲突时,setTimeout()的中的代码优先。但是具体的JavaScript的执行语句出现冲突时,js是如何进行条件优先级判断的还不太明白。
设计目标:[在鼠标移入该弹出区块后,区块继续保持显示状态,在鼠标移出弹出区块后,弹出的隐藏区块再次隐藏。]
联合上段代码分解目标:[在鼠标移入该弹出区块后,定时器停止;鼠标移出弹出区块后,弹出的隐藏区块再次隐藏。]
对JavaScript代码再次编辑:
增加变量代码:
var timer=null;
赋值定时器的返回值:
oDiv1.onmouseout=function()
{
timer=setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}
当鼠标移入oDiv2模块时,oDiv显示并且停止定时器

 oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
clearTimeout(timer);
}
至此,模拟延时提示框的的代码框架基本完工。不过还有几个细节方面可以进行优化。
 
1、当从oDiv2移动到oDiv1时,oDiv2会出现“闪一下”的现象,这是由于鼠标移出oDiv2,oDiv2立刻消失,而鼠标移入oDiv1时,oDiv再次立刻出现,两者时间间隔极短,故而出现oDiv2闪一下。

解决方案:
在鼠标移出oDiv2时,也添加一个延时设计的定时器。

oDiv2.onmouseout=function()
{
setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}
2、在反复多次快速鼠标移入移出后,浏览器似乎出现了“疲惫现象”,处于红色div1区块中,div2也不显示。但是缓慢移出后,再移入又恢复代码编写时的初始原设计目的。

猜测:应该属于代码逻辑性问题。
oDiv1.onmouseover 执行 oDiv2.style.display=block';
oDiv2.onmouseout[包括oDiv1.onmouseover的情形] oDiv2.style.display='none';
这样存在两个截然不同的逻辑结果?

3、观察JsvaScript代码,可以发现代码中存在相当多的类似代码。能否在不改变代码功能的前提下对代码进行精简处理呢?

window.onload=function()
{
var oDiv1=document.getElementById("div1");
var oDiv2=document.getElementById("div2");
var timer=null;
oDiv1.onmouseover=function()
{
oDiv2.style.display="block";
}
//当鼠标移入oDiv1时,oDiv2显示 oDiv1.onmouseout=function()
{
timer=setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}
//在鼠标移出oDiv1时,通过setTimeout()令oDiv2延迟0.5s消失 oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
clearTimeout(timer);
}
//当鼠标移入oDiv2时,oDiv2显示
oDiv2.onmouseout=function()
{
setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
} };
代码精简合并处理:

oDiv1.onmouseout=function()
{
timer=setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}

oDiv2.onmouseout=function()
{
setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}
合并处理

oDiv1.onmouseout=oDiv2.onmouseout=function()
{
timer=setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
}

代码

oDiv1.onmouseover=function()
{
oDiv2.style.display="block";
}

oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
clearTimeout(timer);
}

合并处理

oDiv1.onmouseover=oDiv2.onmouseover=function()
{
oDiv2.style.display="block";
clearTimeout(timer);
}
最终优化的JavaScript代码为
window.onload=function()
{
var oDiv1=document.getElementById("div1");
var oDiv2=document.getElementById("div2");
var timer=null;
oDiv1.onmouseout=oDiv2.onmouseout=function()
{
timer=setTimeout(function()
{
oDiv2.style.display="none";
}
,500);
} oDiv2.onmouseover=oDiv1.onmouseover=function()
{
oDiv2.style.display="block";
clearTimeout(timer);
} };

延时提示框制作思路[简单javascript案例]的更多相关文章

  1. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  2. JS延时提示框

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 31.0px Consolas; color: #2b7ec3 } p.p2 { margin: 0.0px ...

  3. JavaScript实现延时提示框

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  4. 用setTimeout模拟QQ延时提示框

    很简单的代码,不多解释,一看就懂. <!DOCTYPE html> <html> <head> <meta http-equiv="Content- ...

  5. JS定时器的使用--延时提示框

    <title>无标题文档</title> <style> div{float:left;margin:10px;} #div1{width:50px; height ...

  6. 【小练习01】CSS--PS提示框制作

    要求用css和HTML实现下图效果: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  7. 【js+jquery】通用、简单的JS 提示框

    1.该插件不需要依赖 jquery,仅仅使用了原生js 2.简单.通用.可自定义修改样式.支持等待N秒消失.支持消失后跳转其他url , 功能还是比较完善的. 3.不废话,上代码: (我存放的位置在 ...

  8. HTML5 微信二维码提示框

    这是一个js的小案例,主要效果是显示一个微信二维码的提示框,非常简单实用. 源码如下: JS部分 <script src="js/jquery-1.8.3.min.js"&g ...

  9. jQuery EasyUI 教程-Tooltip(提示框)

    <!DOCTYPE html> <html> <head> <title>jQuery Easy UI</title> <meta c ...

随机推荐

  1. 使用selenium实现模拟淘宝登陆

    from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.w ...

  2. pandas操作,按序号取列,按条件筛选,df格式转换等

    这几天遇到比较多的dataframe操作,频繁使用,在此整理记录下,方便查找. 1.num为列的数字序号,name=df.columns[num],返回的是column的字符串名字,df[name]= ...

  3. How To: Multipath Linux x86-64 Release 6.4

    [root@node01 ~]# lsb_release -a LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0 ...

  4. python爬虫17 | 听说你又被封 ip 了,你要学会伪装好自己,这次说说伪装你的头部

    这两天 有小伙伴问小帅b 为什么我爬取 xx 网站的时候 不返回给我数据 而且还甩一句话给我 “系统检测到您频繁访问,请稍后再来” 小帅b看了一下他的代码 ): requests.get(url) 瞬 ...

  5. scrapy——7 scrapy-redis分布式爬虫,用药助手实战,Boss直聘实战,阿布云代理设置

    scrapy——7 什么是scrapy-redis 怎么安装scrapy-redis scrapy-redis常用配置文件 scrapy-redis键名介绍 实战-利用scrapy-redis分布式爬 ...

  6. AIM Tech Round (Div. 2)——ABCD

    http://codeforces.com/contest/624 A.python是用来写div2的AB题的... a, b, x, y = map(float, raw_input().split ...

  7. 树状数组&线段树

    先是树状数组. 令这棵树的结点编号为C1,C2...Cn.令每个结点的值为这棵树的值的总和,那么容易发现: C1 = A1 C2 = A1 + A2 C3 = A3 C4 = A1 + A2 + A3 ...

  8. Sencha Touch 2.1学习图表Chart概述

    Extjs.chart提供了可视化展现数据的能力,每个图表可以绑定到数据模型Ext.data.Store上, 并随着数据的变换可以自动的更新图表 一个图表对象包括图标风格.坐标(axes).序列(se ...

  9. springboot优雅关机

    Spring boot 2.0 之优雅停机  rabbitGYK 关注 2018.05.20 18:41* 字数 1794 阅读 2638评论 0喜欢 22 spring boot 框架在生产环境使用 ...

  10. codevs 1700 施工方案第二季

    1700 施工方案第二季 2012年市队选拔赛北京  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description c国边防 ...