使用jQuery以编程方式在Javascript for IE中触发事件

Dan*_*ert 9 javascript asp.net jquery internet-explorer

当IE中的用户触发事件时,它将设置为该window.event对象.查看触发事件的唯一方法是访问window.event对象(据我所知)

如果以编程方式触发事件(例如通过jQuery触发事件),则会导致ASP.NET验证程序出现问题.在这种情况下,window.event对象存储最后一个用户触发的事件.

当以onchange编程方式触发事件并为其附加了ASP.NET验证程序的文本框启动时,验证会中断,因为它正在查看触发上一个事件的元素,而该事件不是验证程序所针对的元素.

有没有人知道这方面的方法?这似乎是一个可以解决的问题,但从在线看,大多数人只是想方设法忽略问题而不是解决问题.


为了解释我正在做什么:
我在一个文本框上使用了一个jQuery时间选择器插件,该插件还有两个与之关联的ASP.NET验证器.当时间改变时,我正在使用更新面板回发到服务器以动态地执行某些操作,因此我需要触发onchange事件以触发该文本框的回发.

jQuery时间选择器通过创建隐藏的无序列表来操作,该列表在单击文本框时可见.单击其中一个列表项时,将通过jQuery的change()方法以编程方式为文本框触发"更改"事件.

因为事件的触发器是一个列表项,IE将列表项视为事件的来源,而不是文本框,就像它应该的那样.

一旦文本框改变,我就不太关心这个ASP.NET验证器工作了,我只需要处理" change"事件,这样就可以为文本框调用我的回发事件.问题是验证器在IE中抛出一个异常,阻止任何事件被触发.

Firefox(我假设其他浏览器)没有这个问题.由于事件模型不同,只有IE.有没有人遇到过这个并看过如何修复它?


我发现这个问题报告了其他几个地方,但他们没有提供解决方案:

qua*_*ark 7

我有同样的问题.通过使用此功能解决:

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

所以我对datepicker的"onSelect"事件处理程序如下所示:

if ($.browser.msie) {
    datepickerOptions = $.extend(datepickerOptions, { 
        onSelect: function(){
            $(this).fire("change").blur();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


小智 2

根据您的描述,此问题可能是 IE 用于 JS 的独特事件冒泡模型的结果。

我唯一真正的答案是放弃 ASP.NET 验证器并使用 jQuery 表单验证插件。那么您的文本框就可以是一个常规的 ASP Webforms 控件,当内容发生更改并发生回发时,一切都很好。此外,您还可以将更多客户端问题与服务器代码分开。

我从来没有运气好将 Webform 客户端控件(如表单验证控件)与外部 JS 库(如 jQuery)混合在一起。我发现更好的方法是只选择其中之一,而不是混合搭配。

这不是您可能正在寻找的答案。

如果你想使用 jQuery 表单验证插件,请考虑这个jQuery 表单验证