奇怪的问题 - 更改事件仅在IE中的调试下触发

时间:2011-09-05 08:57:54

标签: javascript jquery

我有自动填充代码,在一个文本框中值更改时执行。它看起来像这样:

$('#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,一切正常。

1 个答案:

答案 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);
    }
}