Gan*_*row 7 javascript ajax jquery
我有一个复选框,可以切换某些行为,但如果有人连续100次点击,我不想向服务器端发送100个请求.
这就是我到目前为止所找到的(找到此代码片段):
deBouncer = function($,cf,of, interval){
var debounce = function (func, threshold, execAsap) {
var timeout;
return function debounced () {
var obj = this, args = arguments;
function delayed () {
if (!execAsap)
func.apply(obj, args);
timeout = null;
}
if (timeout)
clearTimeout(timeout);
else if (execAsap)
func.apply(obj, args);
timeout = setTimeout(delayed, threshold || interval);
}
}
jQuery.fn[cf] = function(fn){ return fn ? this.bind(of, debounce(fn)) : this.trigger(cf); };
};
Run Code Online (Sandbox Code Playgroud)
在我的文件准备功能:
deBouncer(jQuery,'smartoggle', 'click', 1500);
Run Code Online (Sandbox Code Playgroud)
然后事件本身:
$(window).smartoggle(function(e){
MyToggleFunction();
});
Run Code Online (Sandbox Code Playgroud)
这是因为我已经将1500毫秒作为去抖动时段,所以如果你用1500毫秒点击n次,它将只向服务器发送最新状态.
然而,使用它有副作用,现在我的其他东西的点击事件搞砸了.我在这里做错了吗?是否有更好的去抖动方法?
pla*_*alx 11
只是去除执行实际工作的功能,我不会为此加载整个库.
var debouncedSomeFunction = debounce(someFunction, 1500);
debouncedSomeFunction();
debouncedSomeFunction();
debouncedSomeFunction();
setTimeout(debouncedSomeFunction, 2000);
function debounce(fn, bufferInterval) {
var timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(fn.apply.bind(fn, this, arguments), bufferInterval);
};
}
function someFunction() {
log('someFunction executed');
}
function log(text) {
document.body.appendChild(document.createTextNode(text));
document.body.appendChild(document.createElement('br'));
}Run Code Online (Sandbox Code Playgroud)
不确定是否有“正确”的方法来做到这一点。
话虽如此,下划线有这样一个实用程序,可以创建函数的去抖版本......
var MyToggleDebounced = _.debounce(MyToggleFunction, 1500);
Run Code Online (Sandbox Code Playgroud)
然后在您的点击处理程序中使用MyToggleDebounced。
链接到 underscorejs 上的 debounce 文档
查看带注释的来源,了解他们是如何做到这一点的。
| 归档时间: |
|
| 查看次数: |
9296 次 |
| 最近记录: |