对文本框监听事件的优化,时间换性能。

achong
2023-02-19 / 0 评论 / 10 阅读 / 正在检测是否收录...

正常情况下,js对文本框控件正常的监听是这样子的。

// 对id为 #content 的控件添加文本修改事件
$(document).on("input propertychange","#content",function(res){
    var newValue = $("#content").val();
    console.log(newValue)
});

博客素材2 00_00_00-00_00_30.gif

​ 可以正常监听文本的变化。但是,太过灵敏了,某些情况下可能不适合。

​ 比如这样一个需求:网页有一个实时同步功能的文本框,文本框内的数据需要实时发送到服务器存储,以便下一次展现。

​ 在打字的情况下,每按下一个字母,都会触发一次文本修改。如果修改监听的回调函数里面是向服务器发送请求的话,即使用户在正常的字的情况下,对服务器来说像是遭受CC攻击了一样,频率太快了。

​ 所以,我对代码进行了改进,时间精度换性能。

var n = 0;    
$(document).on("input propertychange", "#content", function(res){    // 设置文本框监听
    var nn = ++n;
    setTimeout(function(){
        if (n != nn) return;
        UpData();
    }, 1000);
});

博客素材3 00_00_00-00_00_30.gif

​ 通过对比文本修改次数来判断需不需要向服务器发送数据。上面代码中定义了两个变量,一个变量n在外面记录 回调函数 文本变化的次数;另一个临时变量nn记录在 回调函数 执行的那一刻文本变化次数。在 回调函数 里用setTimeout来定时2秒执行一个函数,1秒后,如果内外两个记录文本修改次数的变量相同,则向服务器发送数据,否则直接结束本次执行。

​ 如此循环往复,当用户真正停下来,或者用户暂停撰写时,才往服务器发送本次修改的文本。虽然文本不是真正的实时发送,但是慢一两秒对这个需求来说不是很重要。所以说是时间换性能。

0

评论 (0)

取消