- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JavaScript节流函数Throttle详解教程
在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发。比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove)。也就是说用户在触发这些浏览器操作的时候,如果脚本里面绑定了对应的事件处理方法,这个方法就不停的触发。
这并不是我们想要的,因为有的时候如果事件处理方法比较庞大,DOM 操作比如复杂,还不断的触发此类事件就会造成性能上的损失,导致用户体验下降(UI 反映慢、浏览器卡死等)。所以通常来讲我们会给相应事件添加延迟执行的逻辑。
通常来说我们用下面的代码来实现这个功能:
var COUNT = 0;
function testFn() { console.log(COUNT++); }
// 浏览器resize的时候
// 1. 清除之前的计时器
// 2. 添加一个计时器让真正的函数testFn延后100毫秒触发
window.onresize = function () {
var timer = null;
clearTimeout(timer);
timer = setTimeout(function() {
testFn();
}, 100);
};
细心的同学会发现上面的代码其实是错误的,这是新手会犯的一个问题:setTimeout 函数返回值应该保存在一个相对全局变量里面,否则每次 resize 的时候都会产生一个新的计时器,这样就达不到我们发的效果了
于是我们修改了代码:
var timer = null;
window.onresize = function () {
clearTimeout(timer);
timer = setTimeout(function() {
testFn();
}, 100);
};
这时候代码就正常了,但是又多了一个新问题 —— 产生了一个全局变量 timer。这是我们不想见到的,如果这个页面还有别的功能也叫 timer 不同的代码之前就是产生冲突。为了解决这个问题我们要用 JavaScript 的一个语言特性: HYPERLINK /article/javascript-bibao.html \o 闭包 \t _blank 闭包?closures 。相关知识读者可以去 MDN 中了解,改造后的代码如下:
/**
* 函数节流方法
* @param Function fn 延时调用函数
* @param Number delay 延迟多长时间
* @return Function 延迟执行的方法
*/
var throttle = function (fn, delay) {
var timer = null;
return function () {
clearTimeout(timer);
timer = setTimeout(function() {
fn();
}, delay);
}
};
window.onresize = throttle(testFn, 200, 1000);
我们用一个闭包函数(throttle节流)把 timer 放在内部并且返回延时处理函数,这样以来 timer 变量对外是不可见的,但是内部延时函数触发时还可以访问到 timer 变量。
当然这种写法对于新手来说不好理解,我们可以变换一种写法来理解一下:
var throttle = function (fn, delay) {
var timer = null;
return function () {
clearTimeout(timer);
timer = setTimeout(function() {
fn();
}, delay);
}
};
var f = throttle(testFn, 200);
window.onresize = function () {
f();
};
这里主要了解一点: HYPERLINK /article/javascript-throttle-usage.html \o Throttle \t _blank Throttle?被调用后返回的 function 才是真正的 onresize 触发时需要调用的函数
现在看起来这个方法已经接近完美了,然而实际使用中并非如此。举个例子:
如果用户?不断的?resize 浏览器窗口大小,这时延迟处理函数一次都不会执行
于是我们又要添加一
您可能关注的文档
- ISO14001-2015标准讲解教程.ppt
- 运动控制_第3章____转速、电流双闭环直流调速系统.ppt
- 输电设备状态检测技术方案.docx
- ITSM解决方案介绍教程.ppt
- 运输机械课程设计说明书.docx
- 过秦论(使用).ppt
- 运用财务数据管理门店20160107.pptx
- it基础知识考题教程.doc
- IT支撑系统-讲义及2份答卷教程.docx
- ITSM系统-CA_ITSM系统讲义教程.ppt
- 《GB_T 42902 - 2023碳化硅外延片表面缺陷的测试 激光散射法》最新解读.pptx
- 综合解析京改版数学8年级上册期中试卷附答案详解【考试直接用】.docx
- 综合解析京改版数学8年级上册期中试卷附答案详解(完整版).docx
- 综合解析京改版数学8年级上册期中试卷附完整答案详解(精选题).docx
- 综合解析京改版数学8年级上册期中试卷汇编附答案详解.docx
- 综合解析京改版数学8年级上册期中试卷附答案详解【培优B卷】.docx
- 综合解析京改版数学8年级上册期中试卷及一套完整答案详解.docx
- 《GB_T 42897 - 2023微机电系统(MEMS)技术 硅基MEMS纳米厚度膜抗拉强度试验方法》最新解读.pptx
- 2024年轨道交通项目资金筹措计划书参考(一).pdf
- 综合解析京改版数学8年级上册期末试题附参考答案详解【巩固】.docx
文档评论(0)