热烈欢迎高度关注我的社会公众号:后端高速成长回忆录
序言
在他们写工程项目碰到不乐意的使用者的这时候,比如两个登入按键,他就这回要反反复复点好数次,初始化了/loginUSB好数次,呢好些?
即使牵涉到ajax允诺,就会有这种的情形,假设 1 秒促发了 60 次,每一反弹就要在 1000 / 60 = 16.67ms 内顺利完成,不然就会有雅雷再次出现。
所以多于允诺须要写HDR吗?
总之并非,但凡(可能将)牵涉到频密该事件促发的地方性,都须要写HDR。
window 的 resize、scrollmousedown、mousemovekeyup、keydownclick该事件……他们单纯的写两个小demo,看呵呵没HDR跟有HDR的效用。
标识符:
// html
<button id=”btn” onclick=”shake()”>
<span id=”container”>点选我</span>
</button>
// js
var count = 1;
var container = document.getElementById(container);
var btn = document.getElementById(btn)
function shake() {
container.innerHTML = count++;
};
怎样同时实现HDR
同时实现HDR,要是介绍HDR的基本原理。
HDR是,无论你促发了数次,我只看你最终促发的那一场,因此在若干个天数后去继续执行本次该事件。
依照那个基本原理,他们能写下这段标识符:
function preventShake(todo,time){
let timeout;
return function () {
clearTimeout(timeout)
timeout = setTimeout(todo, time);
}
}
设置两个延迟操作的该事件,因此如果再次促发就把之前的延迟取消掉,重新进入计时。
将它运用在刚刚的例子上:
var count = 1;
var container = document.getElementById(container);
var btn = document.getElementById(btn)
function shake() {
container.innerHTML = count++;
};
function preventShake(todo,time){
var timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(todo, time);
}
}
btn.onclick = preventShake(shake,1000);
他们已经同时实现了基础的它,所以他们继续优化呵呵吧!
this指向优化
看似上面的结果没什么太大问题,但是他们打印呵呵原先的shake和使用了preventShake后的this就会知道,他们指向的并并非两个东西。
原先指向的是
点选我
使用了preventShake后this指向的是Window对象!
于是他们要加一步,是改变this指向。
function preventShake(todo,time){
var timeout;
return function () {
var that = this;
clearTimeout(timeout);
timeout = setTimeout(function(){
todo.apply(that);
}, time);
}
}
这种就解决了this指向可能将带来的问题。
最终
至此,那个简易的HDR函数就写完了,可能将我想的还不太完善,希望大家给予建议,我也会及时学习,之后将其完善,争取做的更好。
感兴趣的朋友能留个高度关注,他们一同进步!