<template>
<div>
<div class="throttle">
<div>输入框节流:</div>
<input type="text" v-model="throttleTxt" placeholder="input输入框节流">
</div>
<div>{{throttleText}}</div>
</div>
</template>
<script>
export default {
data(){
return {
throttleTxt:'',
throttleText:''
}
},
watch: {
throttleTxt(newTxt){
this.throttle(this.allQueryData, null, 500, newTxt);
}
},
methods: {
throttle(fn,context,delay,text){
clearTimeout(fn.timer);
fn.timer=setTimeout(() => {
fn.call(context,text);
},delay);
},
allQueryData(text){
this.throttleText = text
if(text){
console.log('text',text)
}else{
console.log('input为空')
}
},
}
}
</script>
js节流
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input id="search" type="text" name="search">
<script>
function queryData(text){
console.log("搜索:" + text);
}
var input = document.getElementById("search");
input.addEventListener("input", function(event){
throttle(queryData, this.value);
});
function throttle(fn, text, delay = 500, mustApplyTime = 3000, context = null){
clearTimeout(fn.timer);
fn._cur = Date.now(); //记录当前时间
if (!fn._start){ //若该函数是第一次调用,则直接设置_start,即开始时间,为_cur,即此刻的时间
fn._start = fn._cur;
}
if (fn._cur-fn._start > mustApplyTime){
//当前时间与上一次函数被执行的时间作差,与mustApplyTime比较,若大于,则必须执行一次函数,若小于,则重新设置计时器
fn.call(context, text);
fn._start = fn._cur;
} else {
fn.timer = setTimeout(function(){
fn.call(context,text);
}, delay);
}
}
</script>
</body>
</html>