如果事件以程序方式触发,则会在ASP.NET验证器中出现问题,例如通过jQuery触发事件时.在这种情况下,window.event对象存储最后一个用户触发的事件.
当onchange事件以编程方式触发具有连接到其的ASP.NET验证器的文本框时,验证将会中断,因为它正在查看触发最后一个事件的元素,这不是验证器的元素.
有人知道这个吗?这似乎是一个可以解决的问题,但从网上看,大多数人只是想办法忽略这个问题而不是解决问题.
要解释我在做什么具体:
我在一个文本框上使用了一个jQuery时间选择器插件,它也有2个与之相关联的ASP.NET验证器.当时间改变时,我正在使用一个更新面板发回到服务器来动态地做一些事情,所以我需要onchange事件触发,以触发该文本框的回发.
jQuery时间选择器通过创建一个隐藏的无序列表进行操作,该列表在单击文本框时显示.当单击其中一个列表项时,通过jQuery的change()方法通过编程方式对文本框启动“更改”事件.
因为事件的触发器是一个列表项,所以IE将列表项作为事件的源,而不是文本框.
只要文本框发生变化,我也不太在意这个ASP.NET验证器,只需要处理“change”事件,因此我的回传事件被调用为文本框.问题是验证器在IE中引发异常,阻止任何事件被触发.
Firefox(和我假设其他浏览器)没有这个问题.只有IE由于不同的事件模型.有没有人遇到过这个,看到如何解决它?
我发现这个问题报告了其他几个地方,但他们没有提供任何解决方案:
> jQuery’s forum,with the jQuery UI Datepicker and an ASP.NET Validator
> ASP.NET forums,bug with ValidatorOnChange() function
解决方法
jQuery.fn.extend({ fire: function(evttype){ el = this.get(0); if (document.createEvent) { var evt = document.createEvent('HTMLEvents'); evt.initEvent(evttype,false,false); el.dispatchEvent(evt); } else if (document.createEventObject) { el.fireEvent('on' + evttype); } return this; } });
所以我的“onSelect”事件处理程序到datepicker看起来像:
if ($.browser.msie) { datepickerOptions = $.extend(datepickerOptions,{ onSelect: function(){ $(this).fire("change").blur(); } }); }