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 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
Mar 28 Javascript
javascript 获取浏览器版本
Jan 21 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
JavaScript实现点击按钮就复制当前网址
Dec 14 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
Aug 08 Javascript
Vue中定义全局变量与常量的各种方式详解
Aug 23 Javascript
View.post() 不靠谱的地方你知道多少
Aug 29 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
js replace替换字符串同时替换多个方法
Nov 27 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 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 empty函数 使用说明
2009/08/10 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
js中的this关键字详解
2013/09/25 Javascript
JavaScript实现维吉尼亚(Vigenere)密码算法实例
2013/11/22 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
使用 vue.js 构建大型单页应用
2018/02/10 Javascript
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Selenium(Python web测试工具)基本用法详解
2018/08/10 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
用Python+OpenCV对比图像质量的几种方法
2019/07/15 Python
python 同时读取多个文件的例子
2019/07/16 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3实现的闪烁跳跃进度条示例(附源码)
2013/08/19 HTML / CSS
有关HTML5 Video对象的ontimeupdate事件(Chrome上无效)的问题
2013/07/19 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
护士演讲稿范文
2014/01/05 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
单位员工收入证明样本
2014/10/09 职场文书
公司介绍信范文
2015/01/31 职场文书
新闻通讯稿范文
2015/07/22 职场文书
html用代码制作虚线框怎么做? dw制作虚线圆圈的技巧
2022/12/24 HTML / CSS