jquery change()绑定在第一次更改时不会触发(ASP.NET验证)

时间:2011-04-12 15:31:09

标签: asp.net jquery

我有一个包含许多不同元素的表单。在Ready函数中,我正在为这些绑定“更改”:

$(function(){
    $('#someControlID').change(nameOfHandlerFunction);
    .... (similar code for all controls)
}

对于下拉列表,它的工作方式正常,但对于文本框,文本区和复选框,处理器函数在 second 时更改值之前不会被调用。我在处理程序中放置了一个调试器语句来进行双重检查。如果我关注文本框,修改文本并保留焦点,我将不得不第二次这样做以使处理程序运行。知道什么可能导致这种行为吗?

编辑:这是在IE 8中观察到的。

谢谢!

1 个答案:

答案 0 :(得分:1)

ASP.NET是罪魁祸首。我没有在我的问题中提到它,因为我认为它不相关,但你去了。有问题的控件具有链接到它们的关联的ASP.NET Validator控件。在检查时,控制元素“onchange”被设置为称为“ValidatorOnChange”的函数。不知何故,在这些控件上调用jQuery的“change()”导致上述不良行为。

我通过使用自己的事件处理程序解决了这个问题 - 这可能不适合所有人,但是我在加载的库中使用了这个函数,所以我使用它并且页面现在正常工作。

新代码如下:

var el = document.getElementById('someControlId');
el.onchange = appendFunction(el.onchange, nameOfHandlerFunction);

以下是方法本身,以防其他人帮助。

function appendFunction(fn1, fn2) {
    var result;

    // if neither arguments are functions,  return an empty function.
    // if only one argument is a function, return that.
    if (typeof (fn1) !== 'function' && typeof (fn2) !== 'function') {
        result = function () { return; };
    }
    else if (typeof (fn1) === 'function' && typeof (fn2) !== 'function') {
        result = fn1;
    }
    else if (typeof (fn1) !== 'function' && typeof (fn2) === 'function') {
        result = fn2;
    }
    else {
        result = function () {
            fn1();
            fn2();
        }
    }
    return result;
}