JavaScript setTimeout this对象指向问题
上面这幅图片是原始的效果,
现在想鼠标移到图标上,显示图标的提示,但需要延时,也就是鼠标滑至图标上,并不立刻显示,而是等1秒后显示。
html部分
<div class="porHeadRit" >
<a href="" class="a srch s-alt"><span>搜索</span></a>
<a href="" class="a msg m-alt"><span>用户消息</span></a>
<a href="" class="a usr u-alt"><span>个人信息</span></a>
</div>
css样式:
.porHeadRit a.s-alt span,.porHeadRit a.m-alt span,.porHeadRit a.u-alt span{display:none;position:absolute;top:62px;width:56px;
height:24px;line-height:26px;z-index:1;border-radius: 2px;left:0px; background-color: rgba(38, 39, 40, 0.8);font-size: 10px;
font-weight: 400;text-align:center;color:#fff;background:url(../images/info-tip.png) no-repeat;}
通过定位来实现图片的显示在图标的正下方
实现鼠标滑至图标上,延时一秒钟显示,只能通过js来实现
开始写的代码很low,但可以实现功能,就是代码非常臃肿,大家可以看下,后来觉得这也太小儿科了
var timer = null;
function sshowCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".s-alt span").show();
},1000);
};
function shideCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".s-alt span").hide();
},300);
};
function mshowCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".m-alt span").show();
},1000);
};
function mhideCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".m-alt span").hide();
},300);
};
function ushowCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".u-alt span").show();
},1000);
};
function uhideCon(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".u-alt span").hide();
},300);
};
看到了都想笑,后来尝试着优化,写更少的代码,来实现同样的功能,我的代码是这样写的,见下
var spanDom = $(".porHeadRit a");
for(var i=0;i<spanDom.length;i++){
spanDom[i].onmouseover = function(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".porHeadRit a span").show();
},1000);
};
spanDom[i].onmouseleave = function(){
clearTimeout(timer);
timer = setTimeout(function(){
$(".porHeadRit a span").hide();
},300);
};
}
不能实现功能,就是鼠标滑上去,所有的图标的提示都显示了。for循环写的有问题,但也向好的方向的改进。
后来向别人请教,别人提到了jQuery有这样一个方法
$("你的对象").hover(function1,function2);
该函数具体可以参考http://www.jquery123.com/hover/
但是还是没有解决,那是因为在实现的过程setTimeout传this对象是一个很大的坑,开始是这样写的代码
var timer = null;
$(".porHeadRit a").mouseover(function(){
clearTimeout(timer);
timer = setTimeout(function(){
$(this).find('span').show().parent().siblings().children("span").hide();
},500);
}).mouseout(function(){
var that = this;
clearTimeout(timer);
timer = setTimeout(function(){
$(this).find('span').hide();
},300);
});
但是上述写法没有效果,后来查了下,才知道setTimeout传this对象,有个指向的问题,如果没有指定,指向的是全局对象,也就是window.
后来查了下,有一种解决方法,这种解法可以实现鼠标滑至图标处,显示提示,但是没有延时。搞了好久,不知怎么解决。
var timer = null;
$(".porHeadRit a").mouseover(function(){
clearTimeout(timer);
timer = setTimeout(function(self){
$(self).find('span').show().parent().siblings().children("span").hide();
}(this),500);
}).mouseout(function(){
clearTimeout(timer);
timer = setTimeout(function(self){
$(that).find('span').hide();
}(this),300);
});
后来在网上查了解决方法,将this赋给that,通过that来指向当前对象,试了下可以解决问题
var timer = null;
$(".porHeadRit a").mouseover(function(){
var that = this;
clearTimeout(timer);
timer = setTimeout(function(){
$(that).find('span').show().parent().siblings().children("span").hide();
},500);
}).mouseout(function(){
var that = this;
clearTimeout(timer);
timer = setTimeout(function(){
$(that).find('span').hide();
},300);
});
说明:$("").hover(function1,function2);的简写方法是
$("").mouseover().mouseout();用的是jQuery的链式写法。
记录码代码时的问题。
JavaScript setTimeout this对象指向问题的更多相关文章
- JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)
DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...
- JavaScript内置对象与原生对象【转】
原文:https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化 ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- JavaScript学习04 对象
JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...
- JavaScript内置对象与原型继承
(一) 理解JavaScript类定义 1>关于内置对象理解 console.log(Date.prototype.__proto__===Object.prototype //tru ...
- 全面理解Javascript中Function对象的属性和方法
http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...
- javascript第一弹——对象
一. 什么是对象 对象是包含一组变量(称为属性)和函数(称为方法)的集合的实例. javascript中所有事物都是对象 javascript有很多内建对象 javascript允许自定义对象 对象只 ...
- javascript --- jQuery --- Deferred对象
javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应 ...
- javascript之window对象
window :window对象是BOM中所有对象的核心,除了是BOM中所有对象的父对象外,还包含一些窗口控制函数. 1.全局的window对象 JavaScript中的任何一个全局函数或变量都是wi ...
随机推荐
- 批处理启动应用程序(win)
@echo off net session >nul 2>&1 " ( echo Oops: This tools must run with administrator ...
- springboot整合neo4j
刚开始按网上博客搭建 spring boot 和 neo4j一直报sessionFactory找不到,直到下载了spring-data-neo4j的实例demo对比才搭建成功,而且用户名是neo4j, ...
- VisualTreeHelper使用——使用BFS实现高效率的视觉对象搜索
BFS,即广度优先搜索,是一种典型的图论算法.BFS算法与DFS(深度优先搜索)算法相对应,都是寻找图论中寻路的常用算法,两者的实现各有优点. 其中DFS算法常用递归实现,也就是常见的一条路找到黑再找 ...
- JavaScript--封装好的运动函数+旋转木马例子
封装好的运动函数: 1.能控制目标元素的多种属性 2.能自动获取元素的样式表: 3.获取样式函数兼容 4.能对于元素的多属性进行动画(缓动动画)修改 5.能区分透明度等没单位的属性和px属性的变化 a ...
- 泛型List 扩展 比较类
List<string> outputList = resultList.Distinct(new Compare<string>((x, y) => (null != ...
- ELK之java虚拟机安装1
建议:直接按照默认路径,下面有一个路径我有点小改动 java最新版本1.12 从官网上下载oracle官网上的jdk 1.双击这个jdk.exe 2.点击"是" 3.点击下图的&q ...
- es安装遇到的问题
问题1: es一闪即逝的问题?java的jdk环境变量没有配置好, JAVA_HOME没有配置好 必须在系统变量里面添加JAVA_HOME: C:\Program Files\Java\jre1.8. ...
- dsadsa
1.Swift预览 一般来说,编程语言教程中的第一个程序是在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实现: println("Hello, world&qu ...
- Python3 写的远程批量修改文件内容的脚本
一.说明: 1.利用Python的paramiko模块,调用远程的shell命令去修改相应文件. 2.有一个专用配置文件,列出服务器清单. 3.Python循环读取配置文件的服务器IP去连接它,并执行 ...
- oracle回滚机制深入研究
这篇文章主要描写叙述oracle的回滚机制,篇幅可能较长,由于对于oracle的回滚机制来说,要讨论和描写叙述的实在太多,仅仅能刷选自己觉得最有意义的一部分进行深入研究和分享 一.我们来看一个DML语 ...