这是一个非常基本的JavaScript问题,可能重复,但我不知道答案!
我的代码如下:
function userlist_change(myval, function_type) {
// relatively slow code involving Ajax call
// based on Ajax results, change some client-side stuff
}
$("#subjectlist").change(function() {
userlist_change($("#subjectlist").val(), 'change');
}).change();
$("#subjectlist").keypress(function() {
userlist_change($("#subjectlist").val(), 'keypress');
});
我遇到的问题是,如果调用.change()
事件,userlist_change
函数将启动,并且速度相对较慢。如果用户再次更改列表(例如通过键入),我的代码将等待userlist_change
完成,然后使用新值重新启动它。
在UI中看起来很奇怪,因为任何事情都可能需要几秒钟来改变客户端 - 有时候第一次调用的结果只会在用户已经进行过第二次调用之后出现。
当userlist_change
或`keypress()事件被触发时,有什么方法可以中断任何现有的.change()
进程吗?
[编辑]什么是理想的是一个简单的'用这个名字命令杀死任何正在运行的函数'命令 - 这可能吗?或者我真的不得不用计时器捣乱?!
答案 0 :(得分:1)
您可以将最后请求时间存储在全局变量中,并在每个ajax请求中存储请求时间,这样当您只显示第一个请求的结果时,如果全局上次请求时间大于请求,请求时间,你应该表明,其他明智的不是。例如:
var lastRequestTime;
function userlist_change(myval, function_type,requestTime) {
// relatively slow code involving Ajax call
// based on Ajax results, change some client-side stuff
if(lastRequestTime <= requestTime){
//show
}
}
$("#subjectlist").change(function() {
lastRequestTime = new Date();
userlist_change($("#subjectlist").val(), 'change',lastRequestTime );
}).change();
$("#subjectlist").keypress(function() {
lastRequestTime = new Date();
userlist_change($("#subjectlist").val(), 'keypress',lastRequestTime );
});
答案 1 :(得分:0)
您应该使用事件限制。使用RX for JavaScript非常容易,但是库非常复杂。您可以尝试使用计时器过滤值。
这是一个有用的限制插件:http://benalman.com/projects/jquery-throttle-debounce-plugin/