这种情况类似于用户在字段上键入内容时,您希望在用户输入时更新数据/提供数据,但并非每次用户按键都需要更新。
有三种方法可以解决这种情况:
方法一:每次更改时都进行更新
当“某些内容被更改”意味着“用户按下一个键”时,这可能是可行的方法,但对于您的情况——“滑块移动了一点”,则明显不可行。
...
whenSomethingChanges : function(){
updateData();
}
...
function updateData(){
}
方法二:等待事物停止变化,然后更新
即当用户停止输入或停止移动滑块一段时间后,更新您的数据。在滑块的情况下,这种方法足以大幅减少Ajax调用量。但是,它显然的缺点是,如果用户不停地移动元素,则无法看到其操作结果,可能会感到沮丧。
var timeout = 500;
var scheduler = new Scheduler(updateData, timeout);
...
whenSomethingChanges: function(){
scheduler.updateDataInAWhile();
}
...
function Scheduler(callback, timeout){
this.callback = callback;
this.timeout = timeout;
this.updateDataTimeout = null;
this.updateDataInAWhile = function(){
if(this.updateDataTimeout){
clearTimeout(this.updateDataTimeout);
}
var self = this;
this.updateDataTimeout = setTimeout(function(){
self.callCallback();
}, this.timeout);
};
this.callCallback = function(){
if($.isFunction(this.callback)){
this.callback();
}
}
}
function updateData(){
}
第三种方法:定期更新,当事物不断变化时
标题已经说明了一切。这将限制Ajax调用的频率,同时以连续的方式向用户提供反馈。
var timeout = 500;
var scheduler = new Scheduler(updateData, timeout);
....
whenSomethingChanges: function(){
scheduler.keepUpdating();
}
...
function Scheduler(callback, timeout) {
this.callback = callback;
this.timeout = timeout;
this.currentlyUpdating = false;
this.finalTimeout = null;
this.keepUpdating = function(){
if(!this.currentlyUpdating){
this.startPeriodicUpdate();
}
if(this.finalTimeout){
clearTimeout(this.finalTimeout);
}
var self = this;
this.finalTimeout = setTimeout(function(){
self.discontinueUpdates();
}, this.timeout);
};
this.startPeriodicUpdate = function(){
this.currentlyUpdating = true;
this.runPeriodicUpdate();
};
this.runPeriodicUpdate = function(){
if($.isFunction(this.callback)){
this.callback();
}
var self = this;
if(this.currentlyUpdating){
setTimeout(function(){
self.runPeriodicUpdate()
}, self.timeout);
}
};
this.discontinueUpdates = function(){
this.currentlyUpdating = false;
};
}
changed:
,但那还不够好! - Halfpint