上面这幅图片是原始的效果,

现在想鼠标移到图标上,显示图标的提示,但需要延时,也就是鼠标滑至图标上,并不立刻显示,而是等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对象指向问题的更多相关文章

  1. JavaScript基础--DOM对象(十三):(windows对象:history\location\navigator\screen\event)

    DOM编程1.为什么要学习DOM(1) 通过dom编程,我们可以写出各种网页游戏(2)dom编程也是ajax的重要基础2.DOM编程介绍DOM = Document Object Model(文档对象 ...

  2. JavaScript内置对象与原生对象【转】

    原文:https://segmentfault.com/a/1190000002634958 内置对象与原生对象 内置(Build-in)对象与原生(Naitve)对象的区别在于:前者总是在引擎初始化 ...

  3. javascript中的对象,原型,原型链和面向对象

    一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...

  4. JavaScript学习04 对象

    JavaScript学习04 对象 默认对象 日期对象Date, 格式:日期对象名称=new Date([日期参数]) 日期参数: 1.省略(最常用): 2.英文-数值格式:月 日,公元年 [时:分: ...

  5. JavaScript内置对象与原型继承

    (一)   理解JavaScript类定义 1>关于内置对象理解 console.log(Date.prototype.__proto__===Object.prototype    //tru ...

  6. 全面理解Javascript中Function对象的属性和方法

    http://www.cnblogs.com/liontone/p/3970420.html 函数是 JavaScript 中的基本数据类型,在函数这个对象上定义了一些属性和方法,下面我们逐一来介绍这 ...

  7. javascript第一弹——对象

    一. 什么是对象 对象是包含一组变量(称为属性)和函数(称为方法)的集合的实例. javascript中所有事物都是对象 javascript有很多内建对象 javascript允许自定义对象 对象只 ...

  8. javascript --- jQuery --- Deferred对象

    javascript --- jQuery --- Deferred对象 javascript的函数式编程是多么引人入胜,jQuery使代码尽可能的精简,intelligent! defer - 必应 ...

  9. javascript之window对象

    window :window对象是BOM中所有对象的核心,除了是BOM中所有对象的父对象外,还包含一些窗口控制函数. 1.全局的window对象 JavaScript中的任何一个全局函数或变量都是wi ...

随机推荐

  1. Entrust - Laravel 用户权限系统解决方案 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 - Powered by PHPHub

    说明# Zizaco/Entrust 是 Laravel 下 用户权限系统 的解决方案, 配合 用户身份认证 扩展包 Zizaco/confide 使用, 可以快速搭建出一套具备高扩展性的用户系统. ...

  2. bzoj2467 生成树

    传送门 生成树计数裸题,因为模数不是质数所以要用辗转相除的高斯消元. de了很久的bug然后发现一个变量A赋值后下一行又申明了一个新的临时变量A(: //Achen #include<algor ...

  3. 复习解析嵌套json

    在网络上找的一些经典的例子复习使用 一,解析嵌套json字符串,一个json字符串中嵌套另一个json字符串 { "msg": { "resCode": &qu ...

  4. ORACLE常用的环境变量

    ORACLE_HOME:将要安装oracle软件的目录,指向oracle二进制文件应该安装到的位置. ORACLE_BASE:主机服务器上用于oracle软件的顶级目录 ORACLE_SID:定义一个 ...

  5. tyvjP1288 飘飘乎居士取能量块

    P1288 飘飘乎居士取能量块 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 9月21日,pink生日:9月22日,lina生日:9月23日,轮到到飘飘乎居 ...

  6. MSSQL2008 数据压缩方法

    数据压缩功能使得SOL Server 2008允许在表.索引和分区中执行数据压缩,这样不仅可以节省磁盘空间,而且允许更多数据置入RAM中,从而提升数据库查询的性能. 1.启用行压缩 如果我们要在指定的 ...

  7. Future Maker | 领跑亚太 进击的阿里云数据库

    7月31日,阿里云马来西亚峰会在吉隆坡召开,阿里巴巴集团副总裁.阿里云智能数据库事业部总裁李飞飞在演讲中表示:“作为亚太地区第一的云服务提供商,阿里云数据库已为多家马来西亚知名企业提供技术支持,助力企 ...

  8. 各种高度的区别及height、clientHeight、scrollHeight、offsetHeight的区分

    1.height.clientHeight.scrollHeight.offsetHeight 我们来实现test中的onclick事件    function justAtest()    {    ...

  9. Android Bitmap缓存介绍

    转载自http://blog.csdn.net/linghu_java/article/details/8595717 Android中加载一个Bitmap(位图)到你的UI界面是非常简单的,但是如果 ...

  10. 为什么要Code Review

    刚才专注看了下zwchen的博客,读到Code Reivew这一篇,觉得自己也了说话的冲动. 我们Team实施Code Reivew近5年,到今天,我们的结论是: Code Review是我们项目成功 ...