我有自动填充代码,在一个文本框中值更改时执行。它看起来像这样:
$('#myTextBoxId)').change(function () {
var caller = $(this);
var ajaxurl = '@Url.Action("Autocomplete", "Ajax")';
var postData = { myvalue: $(caller).val() }
executeAfterCurrentAjax(function () {
//alert("executing after ajax");
if ($(caller).valid()) {
//alert("field is valid");
$.ajax({ type: 'POST',
url: ajaxurl,
data: postData,
success: function (data) {
//some code that handles ajax call result to update form
}
});
}
});
});
由于此表单字段(myTextBoxId)具有远程验证器,我已经实现了此功能:
function executeAfterCurrentAjax(callback) {
if (ajaxCounter > 0) {
setTimeout(function () { executeAfterCurrentAjax(callback); }, 100);
}
else {
callback();
}
}
此功能使我能够在远程验证结束后执行此自动完成调用,只有当文本框具有有效值时才会导致自动完成。 ajaxCounter
变量是全局变量,其值在全局ajax事件中设置:
$(document).ajaxStart(function () {
ajaxCounter++;
});
$(document).ajaxComplete(function () {
ajaxCounter--;
if (ajaxCounter <= 0) {
ajaxCounter = 0;
}
});
我的问题出现在IE(9)中,只有在我通常使用我的表单时才会出现。问题是executeAfterCurrentAjax(function(){...})里面的函数体;有时由于某种原因不执行。如果我取消注释两个警报中的任何一个,一切都可以正常工作,但如果没有,ajax调用大部分时间都没有(我通过在服务器上调试来检查)。如果我打开开发人员工具并尝试捕获网络或调试javascript,一切正常。
答案 0 :(得分:0)
当远程验证请求完成的同一时刻,当字段失去焦点时,似乎会出现问题。我认为它发生的是executeAfterCurrentAjaxCall中的回调函数立即执行,并且在那一刻jquery验证响应尚未完成,因此$(caller).valid()
返回false。我仍然不知道alert("field is valid")
在这种情况下如何帮助,这可能表明我错了,还有其他事情正在发生。但是,更改executeAfterCurrentAjaxCall所以它看起来似乎解决了我的问题:
function executeAfterCurrentAjax(callback) {
if (ajaxCounter > 0) {
setTimeout(function () { executeAfterCurrentAjax(callback); }, 100);
}
else {
setTimeout(callback, 10);
}
}