js에서 조절 기능을 사용하는 방법(예제 코드 포함)
本篇文章给大家带来的内容是关于js中节流函数的使用方法(附实例代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
一、前言
不知道大家是否遇到过这样一个问题,对于一些函数或者事件它们能够频繁地触发,比如说下面的滚动事件,
window.onscroll = function(){ console.log("触发了事件"); }
当然,需要把body的高度设置高一点(比如说10000px),不然无论你怎么滚动,都看不到效果的~
只要我们滚动鼠标的滚轮或者是拖拽页面的滚动条,上面的事件就能触发,而且非常地频繁(这一点,大家可以自己去尝试一下,通过观察控制台就能体会到了)。
又比如说窗口的onresize事件,
window.onresize = function(){ console.log("触发了事件"); }
只要我们改变窗口的大小,它也能够频繁地触发。说到onresize我就想起了我之前做的一个小球随机运动demo,个人觉得还算可以,所以想分享给大家。
demo演示地址
github源码地址
然而在一些场景下,我们是不希望这种事情发生的,对于这种频繁发生的事件,可以通过节流控制它的频率。
二、节流函数(Throttle)
在说节流之前,我想先提一下水龙头,我相信大家肯定对它不陌生,无论是刷牙洗脸洗碗洗澡什么的都用得着它,在生活中那是无处不在!当我们把水龙头放得很开的时候,那水哗啦啦的流,把它拧紧到一定程度后,水是呈滴状地滴落,而且间隔时间相同。聪明的小伙伴们或许已经发现其中的奥秘了,没错,如果把频繁触发的事件比作水流的话,那么节流函数就是水龙头,能够控制事件触发的频率,也就是说,让原本频繁触发的事件变成间隔相同的时间后才能被触发。
基于上面的思路,我们可以封装一个函数,也就是节流函数,用来控制事件的发生频率,
function throttle(fn,time){ var startTime = new Date();//初始时间 return function(){ var time_ = (new Date() - startTime) >= time;//判断时间间隔是否大于传入的time值,返回布尔值 if(time_){ fn.apply(this); startTime = new Date();//函数执行完后更新初始时间的值 } } }
有了节流函数之后,我们再对上面的事件进行修改如下:
function throttle(fn,time){ var startTime = new Date(); return function(){ var time_ = (new Date() - startTime) >= time; if(time_){ fn.apply(this); startTime = new Date(); } } } function fn(){ console.log("触发了事件"); } window.onscroll = throttle(fn,1000);
同样,别忘了设置body的高度~,fn于是每隔一秒触发一次,并不会频繁地触发了,大家可以自己去试试。
三、节流在无缝轮播中的应用
在无缝轮播中,如果用户疯狂地点击下一张图片按钮的话,那么会出现一个问题,就是上一个动画还没执行完,下一个动画就开始执行了,结果就是会导致整个轮播过程显得非常混乱,用户体验也会下降,就像下面的动图演示一样,
为了解决上述问题,可以用节流控制每次点击事件发生的频率,达到只有在上一张图片的动画执行完了,下一次点击事件才能触发的效果,以下是比较简单的无缝轮播演示demo和代码部分,
无缝轮播演示
代码部分:
/* css代码 */ body{ background-color: #333; } .wrap{ overflow: hidden; position: relative; width: 700px; height: 450px; margin: 100px auto 0; } .wrap .btn{ position: absolute; top: 50%; z-index: 1; width: 50px; height: 80px; margin-top: -40px; background-color: rgba(0,0,0,.5); color: #fff; text-align: center; line-height: 80px; cursor: pointer; } .wrap .left{ left: 0; } .wrap .right{ right: 0; } ul{ transition-timing-function: linear; position: absolute; left: 0; top: 0; list-style: none; margin: 0; padding: 0; width: 3500px; height: 100%; } li{ float: left; width: 700px; height: 100%; } li:nth-of-type(1){ background: url("images/01.jpg") no-repeat center/cover; } li:nth-of-type(2){ background: url("images/02.png") no-repeat center/cover; } li:nth-of-type(3){ background: url("images/03.png") no-repeat center/cover; } li:nth-of-type(4){ background: url("images/04.png") no-repeat center/cover; } li:nth-of-type(5){ background: url("images/01.jpg") no-repeat center/cover; }
<!-- html代码 --><p class="wrap"><p class="btn left"><</p><p class="btn right">></p><ul> <li></li> <li></li> <li></li> <li></li> <li></li></ul></p>
//js代码 (function(){ var oUl = document.getElementsByTagName("ul")[0], aButton = document.getElementsByClassName("btn"), aLi = document.getElementsByTagName("li"), oWidth = parseFloat(getComputedStyle(aLi[0]).width), oWrap = document.getElementsByClassName("wrap")[0], len = aLi.length, index = 0; function btnPre(){ index--; if(index < 0){ oUl.style.transition = 0 + "s"; oUl.style.left = -oWidth*(len-1) + "px"; index = len - 2; setTimeout(function(){ oUl.style.transition = 1 + "s"; oUl.style.left = -oWidth*(index) + "px"; },1000/60); } else{ oUl.style.transition = 1 + "s"; oUl.style.left = -oWidth*(index) + "px"; } } function btnNext(){ index++; if(index === len-1){ oUl.style.left = -oWidth*index + "px"; index = 0; setTimeout(function(){ oUl.style.transition = 0 + "s"; oUl.style.left = 0 + "px"; },1000); } else{ oUl.style.transition = 1 + "s"; oUl.style.left = -oWidth*index + "px"; } } function throttle(fn,time){ var startTime = new Date(); return function(){ var time_ = (new Date() - startTime) >= time; if(time_){ fn.apply(this); startTime = new Date(); } } } aButton[0].onclick = throttle(btnPre,1000); aButton[1].onclick = throttle(btnNext,1000); var timer = setInterval(btnNext,5000); oWrap.onmouseover = function(){ clearInterval(timer); } oWrap.onmouseout = function(){ timer = setInterval(btnNext,5000); } })();
相关推荐:
위 내용은 js에서 조절 기능을 사용하는 방법(예제 코드 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











JavaScript 튜토리얼: HTTP 상태 코드를 얻는 방법, 특정 코드 예제가 필요합니다. 서문: 웹 개발에서는 서버와의 데이터 상호 작용이 종종 포함됩니다. 서버와 통신할 때 반환된 HTTP 상태 코드를 가져와서 작업의 성공 여부를 확인하고 다양한 상태 코드에 따라 해당 처리를 수행해야 하는 경우가 많습니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법과 몇 가지 실용적인 코드 예제를 제공합니다. XMLHttpRequest 사용

JavaScript에서 HTTP 상태 코드를 얻는 방법 소개: 프런트 엔드 개발에서 우리는 종종 백엔드 인터페이스와의 상호 작용을 처리해야 하며 HTTP 상태 코드는 매우 중요한 부분입니다. HTTP 상태 코드를 이해하고 얻는 것은 인터페이스에서 반환된 데이터를 더 잘 처리하는 데 도움이 됩니다. 이 기사에서는 JavaScript를 사용하여 HTTP 상태 코드를 얻는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. HTTP 상태 코드란 무엇입니까? HTTP 상태 코드는 브라우저가 서버에 요청을 시작할 때 서비스가

C++ 람다 식은 다음을 포함하여 함수형 프로그래밍에 이점을 제공합니다. 단순성: 익명 인라인 함수는 코드 가독성을 향상시킵니다. 코드 재사용: 코드 재사용을 용이하게 하기 위해 람다 표현식을 전달하거나 저장할 수 있습니다. 캡슐화: 별도의 함수를 만들지 않고도 코드 조각을 캡슐화하는 방법을 제공합니다. 실제 사례: 목록에서 홀수를 필터링합니다. 목록의 요소 합계를 계산합니다. 람다 표현식은 함수형 프로그래밍의 단순성, 재사용성 및 캡슐화를 달성합니다.

게으른 평가는 게으른 데이터 구조를 사용하여 Go에서 구현할 수 있습니다. 즉, 실제 값을 캡슐화하고 필요할 때만 평가하는 래퍼 유형을 생성합니다. 실제로 필요할 때까지 중간 값 계산을 연기하여 기능적 프로그램에서 피보나치 수열 계산을 최적화합니다. 이는 불필요한 오버헤드를 제거하고 기능적 프로그램의 성능을 향상시킬 수 있습니다.

Go에서 함수형 프로그래밍을 사용할 때 주의해야 할 5가지 일반적인 실수와 함정이 있습니다. 실수로 참조를 수정하지 말고 새로 생성된 변수가 반환되는지 확인하세요. 동시성 문제를 해결하려면 동기화 메커니즘을 사용하거나 외부 변경 가능 상태 캡처를 피하세요. 코드 가독성과 유지 관리성을 향상하려면 부분 기능화를 아껴서 사용하세요. 애플리케이션의 견고성을 보장하기 위해 항상 함수의 오류를 처리하십시오. 인라인 함수, 평면화된 데이터 구조 및 작업 일괄 처리를 사용하여 성능에 미치는 영향을 고려하고 코드를 최적화하세요.

pythonLambda 표현식은 간결하고 읽기 쉽고 사용하기 쉬운 코드를 생성하기 위한 강력하고 유연한 도구입니다. 다른 함수에 인수로 전달되거나 변수에 저장될 수 있는 익명 함수를 빠르게 생성하는 데 유용합니다. Lambda 표현식의 기본 구문은 다음과 같습니다.lambdaarguments:expression예를 들어 다음 Lambda 표현식은 두 개의 숫자를 추가합니다.lambdax,y:x+y 이 Lambda 표현식은 다음과 같이 다른 함수에 인수로 전달될 수 있습니다. defsum( x ,y):returnx+yresult=sum(lambdax,y:x+y,1,2)이 예에서는

Python의 람다 표현식은 익명 함수의 또 다른 구문 형태입니다. 프로그램 어디에서나 정의할 수 있는 작은 익명 함수입니다. 람다 식은 매개변수 목록과 유효한 Python 식일 수 있는 식으로 구성됩니다. Lambda 표현식의 구문은 다음과 같습니다:lambdaargument_list:expression.예를 들어 다음 Lambda 표현식은 두 숫자의 합계를 반환합니다:lambdax,y:x+y 이 Lambda 표현식은 맵과 같은 다른 함수에 전달될 수 있습니다. () 함수: 숫자=[ 1,2,3,4,5]결과=맵(람다

Java 함수형 프로그래밍의 장점에는 단순성, 구성성, 동시성, 테스트 친화성 및 성능이 포함됩니다. 단점으로는 학습 곡선, 디버깅의 어려움, 제한된 유연성, 성능 오버헤드 등이 있습니다. 주요 기능에는 부작용이 없는 순수한 기능, 데이터 처리 파이프라인, 상태 비저장 코드 및 효율적인 스트리밍 API가 포함됩니다.
