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 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
使用jquery实现div的tab切换实例代码
May 27 Javascript
js获取视频时长代码
Apr 10 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
Aug 06 Javascript
jQuery基于cookie实现的购物车实例分析
Dec 24 Javascript
jquery 抽奖小程序实现代码
Oct 12 Javascript
js字符串操作总结(必看篇)
Nov 22 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
详解VUE 数组更新
Dec 16 Javascript
创建echart多个联动的示例代码
Nov 23 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
jQuery实现的移动端图片缩放功能组件示例
May 01 jQuery
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
CI框架安全类Security.php源码分析
2014/11/04 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
再谈ie和firefox下的document.all属性
2009/10/21 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
Nodejs实现批量下载妹纸图
2015/05/28 NodeJs
JavaScript的Backbone.js框架入门学习指引
2016/05/07 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
ajax +NodeJS 实现图片上传实例
2017/06/06 NodeJs
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
Python中的Matplotlib模块入门教程
2015/04/15 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python 并发下载器实现方法示例
2019/11/22 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
2020/10/27 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
利用html5 canvas动态画饼状图的示例代码
2018/04/02 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
安全生产网格化管理实施方案
2014/03/01 职场文书
项目投资意向书
2014/04/01 职场文书
法制报告会主持词
2014/04/02 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python