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 相关文章推荐
JavaScript脚本语言在网页中的简单应用
May 13 Javascript
JavaScript 类似flash效果的立体图片浏览器
Feb 08 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
Aug 18 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
vue项目国际化vue-i18n的安装使用教程
Mar 14 Javascript
浅谈vuepress 踩坑记
Apr 18 Javascript
layui框架table 数据表格的方法级渲染详解
Aug 19 Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 Javascript
javascript+css实现进度条效果
Mar 25 Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 Javascript
微信小程序实现选项卡滑动切换
Oct 22 Javascript
解读Vue组件注册方式
May 15 Vue.js
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
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
javascript创建对象的几种模式介绍
2016/05/06 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
jQuery实现大图轮播
2017/02/13 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
详解js中let与var声明变量的区别
2020/04/05 Javascript
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
Sanic框架配置操作分析
2018/07/17 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
python pytest进阶之xunit fixture详解
2019/06/27 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
广告学毕业生求职信
2014/01/30 职场文书
体育之星事迹材料
2014/05/11 职场文书
警察先进个人事迹材料
2014/05/16 职场文书
空气环保标语
2014/06/12 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
计算机实训报告范文
2014/11/05 职场文书
监守自盗观后感
2015/06/10 职场文书
舞出我人生观后感
2015/06/16 职场文书
高中信息技术教学反思
2016/02/16 职场文书
用Python实现Newton插值法
2021/04/17 Python
关于 Python json中load和loads区别
2021/11/07 Python