jQuery 验证在依赖字段上冻结 IE8

发布于 2024-08-30 09:55:02 字数 3327 浏览 2 评论 0原文

以下代码适用于 FF 和 IE8。现在(常规 Win 更新)一旦 IE 尝试应用 ev_starttimeev_endtime 规则集的任何部分,它就会冻结。 IE CPU 使用率飙升至 50%,但内存使用率不受影响。任一浏览器都没有错误消息(对于 FF 使用 Firebug,对于 IE 使用 IE 开发人员工具)。从CPU使用率的变化来看,我认为IE陷入了循环,但这不是任何其他人都可以看到的循环。有想法吗?

$("form[name='event_form']").validate({
    debug: true,
    rules: {
        title: {required:true, minlength:5},
        description: {required:true, minlength:5},
        event_type_id: "required",
        ev_start: { dateCan: true, required: true},
        ev_end:{ dateCan: true,
                 minDate: "input[name='ev_start']"
        },
        ev_starttime:{
            required: 
                function(element){
                    return $("input[name='allday']:unchecked");
                },
            time: true,
            maxTime: {
                depends: function(element) {
                            return $("input[name='ev_endtime']:filled")
                                   && $("input[name='ev_start']").valid()   
                                   && $("input[name='ev_end']").valid()
                                   && $("input[name='ev_start']").val()==$("input[name='ev_end']").val();
                        },
                param: "input[name='ev_endtime']"
            }
        },
        ev_endtime:{
            required: 
                function(element){
                    return $("input[name='allday']:unchecked")  
                },
            time: true,
            minTime: {
                depends: function(element) {
                            return $("input[name='ev_start']").valid()
                                   && $("input[name='ev_end']").valid()
                                   && $("input[name='ev_starttime']").valid()
                                   && $("input[name='ev_start']").val()==$("input[name='ev_end']").val();
                        },
                param:  "input[name='ev_starttime']"
            }

        }
    }
});

minTime 和 maxTime 规则如下所示:

jQuery.validator.addMethod("minTime", function(value, element, param) {
        try {
            var aftertime=value.split(':');//hours and minutes

            if($(param).val()=='') throw($param.name + ' empty');
            var beforetime=$(param).val().split(':');

            var at=new Date(0,0,0,aftertime[0],aftertime[1]*1);
            var bt=new Date(0,0,0,beforetime[0],beforetime[1]*1);

            return this.optional(element) || at > bt;
        } catch(err){
            return false;
        }
    }, function(param){
        return "Time must occur after " + $(param).val();
    }
);

jQuery.validator.addMethod("maxTime", function(value, element, param) {
        try {
            var beforetime = value.split(':');//hours and minutes

            if($(param).val()=='') throw($param.name + ' empty');
            var aftertime =$(param).val().split(':');

            var at=new Date(0,0,0,aftertime[0],aftertime[1]*1);
            var bt=new Date(0,0,0,beforetime[0],beforetime[1]*1);

            return this.optional(element) || at > bt;
        } catch(err){
            return false;
        }
    }, function(param){
        return "Time must occur before " + $(param).val();
    }
);

The following code was working on FF and on IE8. Now (regular Win-updates) IE freezes as soon as it tries to apply any part of either or both rulesets for ev_starttime and ev_endtime. IE CPU usage shoots to 50%, but memory usage is not affected. There are no error messages from either browser (using Firebug for FF and IE Developer Tools for IE). From the CPU usage change, I'm thinking that IE is getting stuck in a loop, but it's not a loop anyone else can see. Ideas?

$("form[name='event_form']").validate({
    debug: true,
    rules: {
        title: {required:true, minlength:5},
        description: {required:true, minlength:5},
        event_type_id: "required",
        ev_start: { dateCan: true, required: true},
        ev_end:{ dateCan: true,
                 minDate: "input[name='ev_start']"
        },
        ev_starttime:{
            required: 
                function(element){
                    return $("input[name='allday']:unchecked");
                },
            time: true,
            maxTime: {
                depends: function(element) {
                            return $("input[name='ev_endtime']:filled")
                                   && $("input[name='ev_start']").valid()   
                                   && $("input[name='ev_end']").valid()
                                   && $("input[name='ev_start']").val()==$("input[name='ev_end']").val();
                        },
                param: "input[name='ev_endtime']"
            }
        },
        ev_endtime:{
            required: 
                function(element){
                    return $("input[name='allday']:unchecked")  
                },
            time: true,
            minTime: {
                depends: function(element) {
                            return $("input[name='ev_start']").valid()
                                   && $("input[name='ev_end']").valid()
                                   && $("input[name='ev_starttime']").valid()
                                   && $("input[name='ev_start']").val()==$("input[name='ev_end']").val();
                        },
                param:  "input[name='ev_starttime']"
            }

        }
    }
});

minTime and maxTime rules look like this:

jQuery.validator.addMethod("minTime", function(value, element, param) {
        try {
            var aftertime=value.split(':');//hours and minutes

            if($(param).val()=='') throw($param.name + ' empty');
            var beforetime=$(param).val().split(':');

            var at=new Date(0,0,0,aftertime[0],aftertime[1]*1);
            var bt=new Date(0,0,0,beforetime[0],beforetime[1]*1);

            return this.optional(element) || at > bt;
        } catch(err){
            return false;
        }
    }, function(param){
        return "Time must occur after " + $(param).val();
    }
);

jQuery.validator.addMethod("maxTime", function(value, element, param) {
        try {
            var beforetime = value.split(':');//hours and minutes

            if($(param).val()=='') throw($param.name + ' empty');
            var aftertime =$(param).val().split(':');

            var at=new Date(0,0,0,aftertime[0],aftertime[1]*1);
            var bt=new Date(0,0,0,beforetime[0],beforetime[1]*1);

            return this.optional(element) || at > bt;
        } catch(err){
            return false;
        }
    }, function(param){
        return "Time must occur before " + $(param).val();
    }
);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文