JS执行控制之节流模式实例分析


Posted in Javascript onDecember 21, 2018

本文实例讲述了JS执行控制之节流模式。分享给大家供大家参考,具体如下:

节流模式:对重复的业务逻辑进行控制,执行最后一次操作,并取消其他操作,以提高性能。

重复的业务逻辑真的很让人讨厌的,但其中往往蕴含着可被优化的空间。

比如我们经常碰到的一种情况:当鼠标移进容器的时候,改变容器的颜色;当鼠标移出去的时候,恢复默认颜色。

但是有时候是用户不小心移进来的,或者是不小心移出去的,但是效果却消失了。这样用户的体验效果是非常不好的,这时候,我们就可以利用节流模式。

节流模式的核心思想是创造计时器,延迟程序的执行。这也使得计时器中的回调函数的操作异步执行,

源代码:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>3water.com 节流器试用——huansky</title>
</head>
<body>
  <div id="ttt">
    <p id="t1">我只有在鼠标放置两秒后才改变背景色,移出超过两秒才恢复</p>
      <br>
    <p id="t2">我是正常的,只要鼠标移进来就改变背景色,移出就恢复</p>
    <br>
    <p id="t3">我只有在鼠标放置两秒后才改变背景色,移出超过两秒才恢复</p>
  </div>
</body>
<script>
  /** 节流器
   *  @param isclear 获取传入的第一个参数
   * @param fn    第二个参数,表示函数
   **/
  var throttle=function () {
    var isclear=arguments[0],fn;
    if (typeof isclear==="boolean"){
      fn=arguments[1];
      //函数的计时句柄存在,就清除函数
      fn._throttleID && clearTimeout(fn._throttleID);
      if(fn._throttleI){
        console.log(fn._throttleID);
      }
    }
    else{
      fn=isclear;
      param=arguments[1];
      var p={
        context:null,
        args:[],
        time:800,
      };
      //清除执行句柄函数
      arguments.callee(true,fn);
      //为函数绑定计时器的句柄,延迟执行函数
      fn._throttleID=setTimeout(function(){
        //console.log(fn._throttleID);
        fn.apply(p.context,p.args);
      },p.time)
    }
  }
  var dom=document.getElementsByTagName("p");
  var Entefn1=function(){ dom[0].style.cssText="background-color:yellow";};
  var Entefn2=function(){ dom[1].style.cssText="background-color:blue";};
  var Entefn3=function(){ dom[2].style.cssText="background-color:red";};
  var Entefn11=function(){ dom[0].style.cssText="background-color:#fff";};
  var Entefn22=function(){ dom[1].style.cssText="background-color:#fff";};
  var Entefn33=function(){ dom[2].style.cssText="background-color:#fff";};
  dom[0].addEventListener("mouseover",function(){
    throttle(true,Entefn11);
    throttle(Entefn1);
  },false);
  dom[1].addEventListener("mouseover",Entefn2,false);
  dom[2].addEventListener("mouseover",function(){
    throttle(true,Entefn33);
    throttle(Entefn3);
  },false);
  dom[0].addEventListener("mouseout",function(){
    throttle(Entefn11);
    throttle(true,Entefn1);
  },false);
  dom[1].addEventListener("mouseout",Entefn22,false);
  dom[2].addEventListener("mouseout",function(){
    throttle(Entefn33);
    throttle(true,Entefn3);
  },false);
</script>
</html>

这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,运行效果如下:

JS执行控制之节流模式实例分析

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
input、button的不同type值在ajax提交表单时导致的陷阱
Feb 24 Javascript
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
基于JQuery实现鼠标点击文本框显示隐藏提示文本
Feb 23 Javascript
jQuery实现向下滑出的二级菜单效果实例
Aug 22 Javascript
详解jQuery Mobile自定义标签
Jan 06 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
浅谈Javascript事件对象
Feb 05 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
解决layui的使用以及针对select、radio等表单组件不显示的问题
Sep 05 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 #Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 #Javascript
微信小程序实现随机验证码功能
Dec 20 #Javascript
微信小程序实现发送验证码按钮效果
Dec 20 #Javascript
使用puppeteer爬取网站并抓出404无效链接
Dec 20 #Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 #Javascript
js canvas实现橡皮擦效果
Dec 20 #Javascript
You might like
也谈截取首页新闻 - 范例
2006/10/09 PHP
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
javascript中的继承实例代码
2011/04/27 Javascript
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
微信小程序以ssm做后台开发的实现示例
2020/04/08 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
Python 中的 else详解
2016/04/23 Python
python实现多线程抓取知乎用户
2016/12/12 Python
Python生成数字图片代码分享
2017/10/31 Python
pandas值替换方法
2018/07/10 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
加拿大时尚床上用品零售商:QE Home | Quilts Etc
2018/01/22 全球购物
护士长竞聘书
2014/03/31 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
施工安全协议书范本
2014/09/26 职场文书
遗失说明具结保证书
2015/02/26 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
警示教育片观后感
2015/06/17 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
小学英语课教学反思
2016/02/15 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
windows server 2012安装FTP并配置被动模式指定开放端口
2022/06/10 Servers
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android