函数防抖与节流,js中的事件循环机制

###函数防抖与节流
前言:下列场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃:

  1. window对象的resize、scroll事件
  2. 拖拽时的mousemove事件
  3. 射击游戏中的mousedown、keydown事件
  4. 文字输入、自动完成的keyup事件
  • 节流throttle。如果是第一次调用该函数,那么会马上调用func,否则就会记录当前时刻,当第二次调用的时间间隔超过wait时,才调用func。
  • 防抖debounce。当调用动作n毫秒后才会执行该动作,如果在这n毫秒内又调用此动作则将重新计算执行时间。

事件循环机制
js是一个单线程的非阻塞脚本语言。单线程:js代码在执行的任何时候,都只有一个主线程来处理所有任务;非阻塞:当代码需要进行一项异步任务时,主线程会挂起pending这个任务,然后在异步任务返回结果时再根据一定规则去执行相应的回调。
同步代码:当一些列方法被依次调用的时候,因为Js是单线程的,同一时间只能执行一个方法,于是这些方法被排队在一个单独的地方,这个地方叫执行栈。 当一个脚本第一次执行的时候,js引擎会解析这段代码,并将其中的同步代码按照执行顺序加入执行栈中,然后从头开始执行。如果当前执行的是一个方法,那么js会向执行栈中添加这个方法的执行环境,然后进入这个执行环境继续执行其中的代码。当这个执行环境中的代码 执行完毕并返回结果后,js会退出这个执行环境并把这个执行环境销毁,回到上一个方法的执行环境。。这个过程反复进行,直到执行栈中的代码全部执行完毕。
执行栈是同步代码执行时执行上下文存在的空间。事件队列是异步

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现移动端touch事件的横向滑动列表效果并循环展示的一种常见方法是使用CSS3的transform属性和JavaScript的Touch事件。 首先,创建一个容器 div,设置其宽度为视口宽度的倍数,如 300%。在容器内部创建多个 div 元素,分别放置需要展示的内容。 然后,通过CSS3的transform属性将容器的位置移动到第二个或第三个 div 元素的位置,使得第一个 div 元素在视口外不可见。 接下来,使用JavaScript监听Touch事件,根据手指在屏幕上的移动距离,通过改变容器的transform属性来实现横向滑动效果。同时,当容器滑动到最后一个 div 元素时,将其位置移动到第一个 div 元素的位置,实现循环展示的效果。 下面是一个实现横向循环滑动列表效果的示例代码: HTML: ```html <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> ``` CSS: ```css .container { width: 300%; display: flex; transition: transform 0.3s ease-in-out; } .item { flex-basis: calc(100% / 3); text-align: center; font-size: 30px; } ``` JavaScript: ```js var container = document.querySelector('.container'); var startX, startY, moveX, moveY, distanceX, distanceY; container.addEventListener('touchstart', function(e) { startX = e.touches[0].clientX; startY = e.touches[0].clientY; }); container.addEventListener('touchmove', function(e) { moveX = e.touches[0].clientX; moveY = e.touches[0].clientY; distanceX = moveX - startX; distanceY = moveY - startY; if (Math.abs(distanceX) > Math.abs(distanceY)) { e.preventDefault(); container.style.transform = 'translateX(' + (-100 / 3 + distanceX / window.innerWidth * 100) + '%)'; } }); container.addEventListener('touchend', function(e) { if (distanceX > 0 && Math.abs(distanceX) > window.innerWidth / 5) { container.style.transform = 'translateX(' + (-200 / 3) + '%)'; } else if (distanceX < 0 && Math.abs(distanceX) > window.innerWidth / 5) { container.style.transform = 'translateX(' + '0' + '%)'; } else { container.style.transform = 'translateX(' + (-100 / 3) + '%)'; } }); container.addEventListener('transitionend', function() { if (container.style.transform === 'translateX(' + (-200 / 3) + '%)') { container.style.transition = 'none'; container.style.transform = 'translateX(' + (-100 / 3) + '%)'; setTimeout(function() { container.style.transition = 'transform 0.3s ease-in-out'; }, 0); } else if (container.style.transform === 'translateX(' + '0' + '%)') { container.style.transition = 'none'; container.style.transform = 'translateX(' + (-100 / 3 * 2) + '%)'; setTimeout(function() { container.style.transition = 'transform 0.3s ease-in-out'; }, 0); } }); ``` 在这个示例,我们使用了Flex布局和CSS3的calc()函数来创建了一个横向排列的列表。Touch事件监听了用户的滑动操作,通过改变容器的transform属性来实现横向滑动效果。当滑动到最后一个 div 元素时,通过修改transform属性实现循环展示的效果。同时,我们还添加了一些防抖节流的优化,使得滑动效果更加流畅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值