JS防抖

在前端开发的过程中,有时候我们需要对一些事件进行相应,但是,有时候,这些事件可能会十分频繁的触发。比如:

1、window 的 resizescroll
2、mousedown、mousemove
3、keyup、keydown

为了解决这样的问题,一般会有两种方案来解决:
防抖和节流(debounce and throttle)

本篇将讲述第一种方案:防抖

防抖

防抖的原理就是,触发事件的回调函数会在事件被触发后的n毫秒后执行,假如在这n毫秒内,该事件再次被触发,那么就会以新的触发时间为准,n毫秒后执行。这样,就是当n毫秒内事件不再被触发的时候,该事件才会真正的执行。

例子:

防抖前:

var count = 1;
var container = document.getElementById('container');

function getUserAction() {
    container.innerHTML = count++;
};


container.onmousemove = getUserAction;

防抖后:

function debounce(func, wait) {
    var timeout;
    return function () {
        clearTimeout(timeout)
        timeout = setTimeout(func, wait);
    }
}

container.onmousemove = debounce(getUserAction, 1000);

this的问题

如果我们在最初的 getUserAction 函数中 console.log(this),输出的将会是container div, 但是如果使用了debounce,this将会丢失,指向window对象。这里我们需要修改代码使得this的指向不被改变。

function debounce(func, wait) {
    var timeout;

    return function () {
        var context = this;

        clearTimeout(timeout)
        timeout = setTimeout(function(){
            func.apply(context)
        }, wait);
    }
}

* event的问题 *

如果我们在函数getUserAction中获取event对象,是可以获取到的:

function getUserAction(e) {
    console.log(e);
    container.innerHTML = count++;
};

但是如果在debounce函数中, 将会丢失event,只能打印出undefined。

我们可以将代码继续修改为:

function debounce(func, wait) {
    var timeout;

    return function () {
        var context = this;
        var args = arguments;

        clearTimeout(timeout)
        timeout = setTimeout(function(){
            func.apply(context, args)
        }, wait);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值