HTML:

<div id='allType'>
<div class='allTypeHead'><span>所有分类</span></div>
<ul class='allType'>
<li style="background:url('__PUBLIC__/img/建筑师的非建筑.png') no-repeat 0 13px;position:relative;"><a href="<{:U('Pro/more',array('type'=>1))}>">&nbsp;设计小物</a></li>
<li style="background:url('__PUBLIC__/img/虚拟物件.png') no-repeat 0 11px;position:relative;"><a href="<{:U('Pro/more',array('type'=>2))}>">&nbsp;虚拟物件</a></li>
<li style="background:url('__PUBLIC__/img/材料推荐.png') no-repeat 3px 12px;position:relative;"><a href="<{:U('Pro/more',array('type'=>3))}>">&nbsp;材料推荐</a></li>
</ul>
</div>

Javascript:

// 声明全局变量addUl,如果声明在函数内部,则鼠标划入划出时都是创建的新变量,导致无法清除划入时的定时器
var addUl;
$(function() {
// 动态绑定不能绑定hover,只能用mouseenter mouseleave替代
$('#allType').on('mouseenter mouseleave', 'li', function(e) {
var t = $(this);
if (e.type == 'mouseenter') {
var a = $(this).find('a');
var width = $(this).width();
var href = a.attr('href');
var arr = href.split('/');
var id = arr[arr.length - 1];
arr = id.split('.');
id = arr[0];
// 由于jquery的BUG导致鼠标滑动过快的时候会有二级分类不会移除的情况,而这里使用的又不是动画,所以不能使用stop()。因此只能通过设置延迟执行AJAX来完成下级分类的添加
// 由于setTimeout()的延迟执行特效,所以在执行的函数中直接使用外部函数的变量是无法获取到的,因为当执行的时候变量已经销毁了。所以,这里就使用了一个闭包的方法来达到能调用外部函数的目的。
// 通常的setTimeout(function(){...},100)是这样写的,也就是第一个参数是个函数,里面是要执行的代码片段。
// 这里就使用了闭包的方法return function(){...},第一个参数则接收到了一个函数,并往闭包中传入参数,这样就能先将变量赋给闭包的形参,里面的函数调用的就是闭包的形参,外部函数的销毁便不会影响到函数的执行了
addUl = setTimeout(function(a, id, width) {
return function() {
$.post(
'<{:U("Index/type")}>', { 'id': id },
function(data) {
if (data) {
var ul = '<ul style="background:white;position:absolute;left:' + width + 'px;top:-1px;z-index:100;border:1px solid #6386ae";>';
var id;
var href;
$.each(data, function(n, v) {
id = v['type_id'];
// 不能使用array()传参,并且还要加上Home
href = '<{:U("Home/Pro/more/type/' + id + '")}>';
ul += '<li style="margin:0;padding:0;text-align:center;width:100px;height:40px;overflow:hidden;" title="' + v['type_name'] + '"><a href="' + href + '" style="margin:0;width:auto;">' + v['type_name'] + '</a></li>';
});
ul += '</ul>';
a.after(ul);
};
}
);
}
}(a, id, width), 200);
// 阻止事件冒泡:当从三级分类移动到二级分类的时候,由于二级分类是在一级分类里创建的元素,所以会同时触发二级分类和一级分类的mouseenter事件,所以需要阻止冒泡行为!
e.stopPropagation();
} else {
// 当鼠标滑动过快的时候,会移除延迟的AJAX请求
clearTimeout(addUl);
// 鼠标移开任何一个li的时候都会移除子分类
t.find('ul').remove();
}
});
});

动态绑定AJAX,获取下级分类并延迟执行的更多相关文章

  1. js获取时间,循环执行任务,延迟执行任务

    一.获取时间 核心方法创建一个时间对象:new Date() 时间对象相关操作 时间对象.函数名 函数名 功能 getYear() 获取四位数的年份 getMonth() 获取2位数的月数, 这个是从 ...

  2. 通过async实现协程的延迟执行及结果获取

    在上一次https://www.cnblogs.com/webor2006/p/12022065.html对于协程的async和wait进行了初步的学习,其可以加速执行的性能,其实对于async它是提 ...

  3. C#中Linq延迟执行问题

    本文来自:http://msdn.microsoft.com/zh-cn/library/bb399393(v=vs.110).aspx http://www.cnblogs.com/zhanglin ...

  4. 放养的小爬虫--京东定向爬虫(AJAX获取价格数据)

    放养的小爬虫--京东定向爬虫(AJAX获取价格数据) 笔者声明:只用于学习交流,不用于其他途径.源代码已上传github.githu地址:https://github.com/Erma-Wang/Sp ...

  5. LINQ之路 6:延迟执行(Deferred Execution)

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  6. Jquery 模板插件 jquery.tmpl.js 的使用方法(1):基本语法,绑定,each循环,ajax获取json数据

    jquery.tmpl.js 是一个模板js  ,主要有2个方法 (1):$.template()方法,将一段script或者是Html编译为模板,例如 $.template('myTemplate' ...

  7. Linq延迟执行

    LINQ中大部分查询运算符都有一个非常重要的特性:延迟执行.这意味着,他们不是在查询创建的时候执行,而是在遍历的时候执行(换句话说,当enumerator的MoveNext方法被调用时).让我们考虑下 ...

  8. JS页面延迟执行一些方法(整理)

    一般在JS页面延迟执行一些方法.可以使用以下的方法 jQuery.delay()方法简介 http://shawphy.com/2010/11/jquery-delay.html jQuery中que ...

  9. ajax多次请求,只执行最后一次的方法

    ajax多次请求,只执行最后一次的方法 有时候点击按钮进行异步请求数据的时候可能网络差,用户会点击很多次,或者页面有很多相同的按钮,参数不同,但是调用的ajax相同,只想得到最后一次结果 我的思路是用 ...

随机推荐

  1. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  2. 3.2 x86体系结构

    计算机组成 3 指令系统体系结构 3.2 x86体系结构 X86是商业上最为成功,影响力最大的一种体系结构.但从技术的角度看,它又存在着很多的问题,那我们就来一起分析X86这种体系结构的特点. 要探讨 ...

  3. 4-2 什么是WebSocket; Action Cable的使用。Rails guide-6.3视频教学,没有看!

    WebSocket WebSocket是一种在单个TCP连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSock ...

  4. Java基础-面向对象(08)

    面向过程 完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现.一步一步去实现,而具体的每一步都需要我们去实现和操作.这些步骤相互调用和协作,完成我们的需求.面向过程开发 ...

  5. ADO.NET 体系结构

    两个部分 .NET 数据提供者 DataSet 数据提供者 SqlClient 提供者 OleDb 提供者 Odbc 提供者 数据提供者组件 数据对象 DataSet

  6. React脚手架create-react-app+elementUI使用

    一.介绍 1.create-react-app是FaceBook官方发布了一个无需配置的.用于快速构建开发环境的脚手架工具. 2.优点 a.无需配置:官方的配置堪称完美,几乎不用你再配置任何东西,就可 ...

  7. 为什么要使用encodeURL转换URL编码?

    参考: https://www.cnblogs.com/haitao-fan/p/3399018.html http://www.ruanyifeng.com/blog/2010/02/url_enc ...

  8. 读书笔记 C# 控制台应用程序之Main方法浅析

    Main方法是C#控制台应用程序和Windows窗体应用程序的入口点.Main方法可以有形参,也可以没有,可以有返回值(int整型),也可以没有.如下定义: 无返回值.无形参的格式: static v ...

  9. Spring学习笔记之Testing

    测试嘛,一般也就两种,一种就是单元测试,另外一个就是集成测试.都是废话 一.单元测试 以前也就是搞个模拟,main函数一写搞定. 现在呢,有了个spring,也有了个推荐规范?这个是个什么东西?什么叫 ...

  10. Mac OS X 10.9下解决cocos2d-x在Xcode4.6.x的模板不显示问题

    最近将iMac 升级到10.9了,奇怪的事情发生了,cocos2d-x的模板不见了,鼓捣了半天发现问题所在 打开xcode新建工程却找不到cocos2d-x的模板. 经过在网上的苦苦搜寻和试验后,找到 ...