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 相关文章推荐
jquery获取div宽度的实现思路与代码
Jan 13 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
jQuery操作JSON的CRUD用法实例
Feb 25 Javascript
深入分析Javascript跨域问题
Apr 17 Javascript
JavaScript中利用Array和Object实现Map的方法
Jul 27 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
Jun 13 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
Aug 31 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
Apr 24 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
Feb 21 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 Javascript
Vue3.x源码调试的实现方法
Oct 13 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
PHP几个数学计算的内部函数学习整理
2011/08/06 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python Socket编程入门教程
2014/07/11 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Django保护敏感信息的方法示例
2019/05/09 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
python FTP编程基础入门
2021/02/27 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
自荐信包含哪些内容
2013/10/30 职场文书
自我评价的写作规则
2014/01/06 职场文书
医学生自我评价
2014/01/27 职场文书
环保倡议书
2014/04/14 职场文书
国企干部对照检查材料
2014/08/22 职场文书
保密工作承诺书
2014/08/29 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
高中生毕业评语
2014/12/30 职场文书
教师考核评语大全
2014/12/31 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
Opencv实现二维直方图的计算及绘制
2021/07/21 Python