Ajaxを介してリストビューの更新をリッスンしkeyup
、トリガーする検索入力があります。change
次のようになります。
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 リクエストが配置されます (イベント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 );
}
});
でもこれは全然よろしくない…。
質問:
必要な関数が 1 回だけ実行されるように、両方が起動する 2 つのバインディングを使用するにはどうすればよいですか?
編集:
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 Update をトリガーしないようにする方法に関する実際の問題に関してはあまり役に立ちません。