【发布时间】:2012-12-03 17:14:42
【问题描述】:
我有一个搜索输入,它侦听 keyup 和 change 以通过 Ajax 触发列表视图的更新。
看起来像这样:
input.on('keyup change', function(e) {
if (timer) {
window.clearTimeout(timer);
}
timer = window.setTimeout( function() {
timer = null;
val = input.val();
el = input.closest('ul');
// run a function - triggers Ajax
widget[func](dyn, el, lib_template, locale, val, "update");
}, interval );
});
一切正常,除了超时和绑定的处理,这会导致放置双 Ajax 请求而不是单个 Ajax 请求(当 keyup 已通过时,change 事件再次触发相同的 Ajax 请求) .
我可以通过添加另一个超时来“解决”这个问题:
var runner = false;
input.on('keyup change', function(e) {
if ( runner === false ){
runner = true;
if (timer) {
window.clearTimeout(timer);
}
timer = window.setTimeout( function() {
timer = null;
val = input.val();
el = input.closest('ul');
widget[func](dyn, el, lib_template, locale, val, "update");
// ssh....
window.setTimeout( function(){ runner = false; },2500);
}, interval );
}
});
但这一点都不好……
问题:
如何确保两个都触发的绑定,我需要的函数只运行一次?
编辑:
Ajax 调用在这里触发:
widget[func](dyn, el, lib_template, locale, val, "update");
调用该函数构建动态列表视图
buildListView : function( dyn,el,lib_template,locale,val,what ){
...
// this calls my AJax Config "getUsers"
$.parseJSON( dynoData[ dyn.method ](cbk, val, dyn.display) );
});
// config AJAX
getUsers: function(cbk, val, recs){
var form = "",
pullRetailers = ( val === undefined ? "" : val ),
service = "../services/some.cfc",
method = "by",
returnformat = "json",
targetUrl = "",
formdata = "...manually_serialized...,
successHandler = function(objResponse, cbk) {
cbk( objResponse );
};
// finally pass to the generic JSON handler
ajaxFormSubmit( form, service, formdata, targetUrl, successHandler, "yes", "", returnformat, cbk );
}
// generic AJAX
var ajaxFormSubmit =
function ( form, service, formdata, targetUrl, successHandler, dataHandler, errorHandler, returnformat, type ){
...
$.ajax({
async: false,
type: type == "" ? "get" : type,
url: service,
data: formdata,
contentType: 'application/x-www-form-urlencoded',
dataType: returnformat,
success: function( objResponse ){
if (objResponse.SUCCESS == true || typeof objResponse === "string" ){
dataHandler == "yes" ? successHandler( objResponse, override ) : successHandler( override );
}
},
error: function (jqXHR, XMLHttpRequest, textStatus, errorThrown) { }
});
}
但这对于如何防止这两个事件触发我的 Ajax 更新的实际问题并没有太大帮助。
【问题讨论】:
-
我没有看到 Ajax 调用在哪里完成?
标签: javascript jquery event-handling timeout jquery-events