我有一个包含许多不同元素的表单。在Ready函数中,我正在为这些绑定“更改”:
$(function(){
$('#someControlID').change(nameOfHandlerFunction);
.... (similar code for all controls)
}
对于下拉列表,它的工作方式正常,但对于文本框,文本区和复选框,处理器函数在 second 时更改值之前不会被调用。我在处理程序中放置了一个调试器语句来进行双重检查。如果我关注文本框,修改文本并保留焦点,我将不得不第二次这样做以使处理程序运行。知道什么可能导致这种行为吗?
编辑:这是在IE 8中观察到的。
谢谢!
答案 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;
}