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 相关文章推荐
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
Jul 08 Javascript
解决Jquery鼠标经过不停滑动的问题
Mar 03 Javascript
js实现点击链接后窗口缩小并居中的方法
Mar 02 Javascript
jquery控制页面的展开和隐藏实现方法(推荐)
Oct 15 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
一道面试题引发的对javascript类型转换的思考
Mar 06 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
Mar 23 jQuery
js 获取html5的data属性实现方法
Jul 28 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
Aug 14 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
关于layui的下拉搜索框异步加载数据的解决方法
Sep 28 Javascript
vue ant design 封装弹窗表单的使用
Jun 01 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单件模式结合命令链模式使用说明
2008/09/07 PHP
php cache类代码(php数据缓存类)
2010/04/15 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
2014/04/30 PHP
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
js中if语句的几种优化代码写法
2011/03/12 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JavaScript的this关键字的理解
2016/06/18 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
2016/07/05 Javascript
原生js jquery ajax请求以及jsonp的调用方法
2017/08/04 jQuery
AngularJS通过ng-Img-Crop实现头像截取的示例
2017/08/17 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
原生js实现无缝轮播图
2020/01/11 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
工程部经理岗位职责
2013/12/08 职场文书
仓库保管员岗位职责
2013/12/20 职场文书
宿舍违规检讨书
2014/01/12 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
学校节能减排方案
2014/06/13 职场文书
八一建军节演讲稿
2014/09/10 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书