Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 423|回复: 0

JqueryValidate表单相同Name不校验问题解决

[复制链接]
  • TA的每日心情
    奋斗
    前天 22:27
  • 签到天数: 787 天

    [LV.10]以坛为家III

    2049

    主题

    2107

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    722142
    发表于 2021-5-29 12:18:54 | 显示全部楼层 |阅读模式

    在使用Jquery validate中遇到一个问题,当表单元素有name相同字段时,validate只校验表单元素name第一个值是否通过校验,比如

    <input type="text" name="userName"/>
    <input type="text" name="userName"/>
    <input type="text" name="userName"/>
    
    <select name="favour"></select>
    <select name="favour"></select>
    <select name="favour"></select>
    

    这时候,jquery validate,只会校验第一个元素,看了一下源码(https://cdn.bootcss.com/jquery-validate/1.17.0/jquery.validate.js),是因为它在获取form元素时,做了一层cache处理。

    elements: function() {
    			var validator = this,
    				rulesCache = {};
    
    			// Select all valid inputs inside the form (no submit or reset buttons)
    			return $( this.currentForm )
    			.find( "input, select, textarea, [contenteditable]" )
    			.not( ":submit, :reset, :image, :disabled" )
    			.not( this.settings.ignore )
    			.filter( function() {
    				var name = this.name || $( this ).attr( "name" ); // For contenteditable
    				if ( !name && validator.settings.debug && window.console ) {
    					console.error( "%o has no name assigned", this );
    				}
    
    				// Set form expando on contenteditable
    				if ( this.hasAttribute( "contenteditable" ) ) {
    					this.form = $( this ).closest( "form" )[ 0 ];
    					this.name = name;
    				}
    
    				// Select only the first element for each name, and only those with rules specified,缓存判断
    				if ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
    					return false;
    				}
    				// 在这里做了一层Cache,如果下次再来相同的Name,则不会再进入validate的校验List
    				rulesCache[ name ] = true;
    				return true;
    			} );
    		},
    

    解决办法

    1. 我们可以更改源码cache的key的名字或者在Jquery页面load完毕后,修改property上的validate原型方法,它使用name可能会造成这种bug,那我们使用Id,一般Id是不会重复的,如果Id不存在,我们再使用name来做为cache的key,简单来说,就是一行代码

    var name = this.id || this.name || $( this ).attr( "name" ); // For contenteditable
    

    比原有的

    var name = this.name || $( this ).attr( "name" ); // For contenteditable 
    

    多了一个 this.id 判断。

    2. 页面加载完成后修改的方式:

    $(function() {
        if ($.validator) {
            //fix: when several input elements shares the same name, but has different id-ies....
            $.validator.prototype.elements = function() {
                var validator = this,
                rulesCache = {};
                // select all valid inputs inside the form (no submit or reset buttons)
                // workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved
                return $([]).add(this.currentForm.elements).filter(":input").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function() {
                    // 这里加入ID判断
                    var elementIdentification = this.id || this.name; ! elementIdentification && validator.settings.debug && window.console && console.error("%o has no id nor name assigned", this);
                    // select only the first element for each name, and only those with rules specified
                    if (elementIdentification in rulesCache || !validator.objectLength($(this).rules())) return false;
                    rulesCache[elementIdentification] = true;
                    return true;
                });
            };
        }
    });
    

    记得给你name相同的表单元素添加id哦~

    参考:http://www.jb51.net/article/101085.htm

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-8-30 00:07 , Processed in 0.064482 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表