Bootstrap整合select2以及jquery.validate.js校验select2框架失效解决方案

为了方便,这里上次那个JqueryValidate框架整合bootstrap的demo中拿出来修改了


一、Bootstrap整合select2框架

这里使用的是 jquery select2框架的版本号为 Version: 3.4.5

1.下载并导入jquery select2的css和js文件

<!-- 引入jquery select2 css文件-->
<link href="jquery-select2/3.4/select2.min.css" type="text/css" rel="stylesheet" />

<!-- 引入jquery select2 js 文件-->
<script type="text/javascript" src="jquery-select2/3.4/select2.min.js" ></script>

2.编写页面,并使用sleect2美化下拉框:这里直接上源码:

关键性代码,$("#hobby")为页面中的selelect控件

//select2美化下拉框控件
$("#hobby").select2();

源码(index.html): 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>bootstrap整合select2框架</title>
		<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
		<!-- sdfdsf-->
		<link href="jquery-select2/3.4/select2.min.css" type="text/css" rel="stylesheet" />
		<style type="text/css">
		/** 
		 * 重新定义错误样式及图标
		 * 1、防止与bootstrap样式中的label冲突 (label: display: block),导致label换行了
		 * 2、添加错误图标显示 
		 */	
		.requiedField{
			color: red;
		}
		label {
		    display: inline-block;
		    margin-bottom: 0;
		}	
		label.error {
		    background: url(./img/unchecked.gif) no-repeat 5px 3px;
		    padding-left: 24px;
		    color: #EA5200;
		}	
		
		</style>
	</head>
	<body>
		<fieldset >
			<legend>用户注册</legend>
		<form class="form-horizontal" id="registerForm" method="post" onsubmit="return false;">
			<div class="control-group">
				<label class="control-label">昵称</label>
				<div class="controls">
					<input type="text" class="{required:true}" name="nickname" placeholder="请填写昵称" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称2</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:2}" name="nickname2" placeholder="请填写昵称2" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称3</label>
				<div class="controls">
					<input type="text" class="{required:true,maxlength:10}" name="nickname3" placeholder="请填写昵称3" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">用户名</label>
				<div class="controls">
					<input type="text" class="{required:true,username:true,minLength:6,maxlength:20}" name="username" placeholder="请填写用户名" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">密码</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:6,maxlength:20}" id="password" name="password" placeholder="请填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">确认密码</label>
				<div class="controls">
					<input type="text" class="{required:true,equalTo:'#password'}" name="confirmPassword" placeholder="请再次填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">手机号码</label>
				<div class="controls">
					<input type="text" class="{required:true,mobile:true}" name="mobile" placeholder="请填写手机号" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">email</label>
				<div class="controls">
					<input type="text" class="{required:true,email:true}" name="email" placeholder="请填写email" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">年龄</label>
				<div class="controls">
					<input type="text" class="{required:true,min: 18,max:100}" name="age" placeholder="请填写" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<hr />
			以下是否使用了jquery select2框架美化select控件的效果
			<hr />
			<div class="control-group">
				<label class="control-label">职位(默认下拉框)</label>
				<div class="controls">
					<select name="position" id="position">
						<option value="">选择职位</option>
						<option value="1">程序员</option>
						<option value="2">销售员</option>
						<option value="3">服务员</option>
						<option value="4">工人</option>
						<option value="5">其他</option>
					</select>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">爱好(使用select2)</label>
				<div class="controls">
					<select name="hobby" id="hobby">
						<option value="">选择爱好</option>
						<option value="1">登山</option>
						<option value="2">游泳</option>
						<option value="3">音乐</option>
						<option value="4">读书</option>
						<option value="5">其他</option>
					</select>
				</div>
			</div>
			
			<div class="form-actions">
				<button type="submit" class="btn btn-primary">保存</button>
				<button type="button" class="btn">重置</button>
			</div>
		</form>
		
		</fieldset>
		
		<script type="text/javascript" src="jquery/jquery-1.9.0.min.js" ></script>
		<script type="text/javascript" src="bootstrap/js/bootstrap.min.js" ></script>
		<script type="text/javascript" src="js/jquery.metadata.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.methods.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.cn.js" ></script>
		<!-- 引入jquery select2 -->
		<script type="text/javascript" src="jquery-select2/3.4/select2.min.js" ></script>
		<script type="text/javascript">
			$(function(){
				$("#registerForm").validate({
				  	submitHandler:function(form){
						form.submit();
					}
				});
				//select2美化下拉框控件
				$("#hobby").select2();
			})
			
		</script>
	</body>
</html>

3.效果图:

可以看到,使用了select2美化后,不仅样式好看及自适应内容显示下拉框,还可以使用搜索功能。


二、jquery.validate.js校验select2框架失效解决方案

验证失效问题,这里分两种情况说明:

情况1:直接在select2美化后的select控件中添加  class="{required:true}":

以下是否使用了jquery select2框架美化select控件的效果
<hr />
<div class="control-group">
	<label class="control-label">职位(默认下拉框)</label>
	<div class="controls">
					<select name="position" id="position" class="{required:true}">
						<option value="">选择职位</option>
						<option value="1">程序员</option>
						<option value="2">销售员</option>
						<option value="3">服务员</option>
						<option value="4">工人</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">爱好(使用select2)</label>
				<div class="controls">
					<select name="hobby" id="hobby" class="{required:true}">
						<option value="">选择爱好</option>
						<option value="1">登山</option>
						<option value="2">游泳</option>
						<option value="3">音乐</option>
						<option value="4">读书</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>

问题:当选择了其他选项选择后,无法进行校验了,页面一直提示为必填项了

表单验证初始化的时候正常:

解决办法:

在select2控件中添加chang事件,让验证框架进行验证

<script type="text/javascript">
$(function(){
	$("#registerForm").validate({
			submitHandler:function(form){
						form.submit();
			}
	});
	//select2美化下拉框控件
	$("#hobby").select2();
	/** 添加事件 */
	$("#hobby").change(function(){
		$(this).valid();
	});

})			
</script>

解决后效果图:

源码(index2.html):

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>jquery.validate.js校验select2框架失效</title>
		<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
		<!-- sdfdsf-->
		<link href="jquery-select2/3.4/select2.min.css" type="text/css" rel="stylesheet" />
		<style type="text/css">
		/** 
		 * 重新定义错误样式及图标
		 * 1、防止与bootstrap样式中的label冲突 (label: display: block),导致label换行了
		 * 2、添加错误图标显示 
		 */	
		.requiedField{
			color: red;
		}
		label {
		    display: inline-block;
		    margin-bottom: 0;
		}	
		label.error {
		    background: url(./img/unchecked.gif) no-repeat 5px 3px;
		    padding-left: 24px;
		    color: #EA5200;
		}	
		
		</style>
	</head>
	<body>
		<fieldset >
			<legend>用户注册</legend>
		<form class="form-horizontal" id="registerForm" method="post" onsubmit="return false;">
			<div class="control-group">
				<label class="control-label">昵称</label>
				<div class="controls">
					<input type="text" class="{required:true}" name="nickname" placeholder="请填写昵称" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称2</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:2}" name="nickname2" placeholder="请填写昵称2" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称3</label>
				<div class="controls">
					<input type="text" class="{required:true,maxlength:10}" name="nickname3" placeholder="请填写昵称3" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">用户名</label>
				<div class="controls">
					<input type="text" class="{required:true,username:true,minLength:6,maxlength:20}" name="username" placeholder="请填写用户名" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">密码</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:6,maxlength:20}" id="password" name="password" placeholder="请填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">确认密码</label>
				<div class="controls">
					<input type="text" class="{required:true,equalTo:'#password'}" name="confirmPassword" placeholder="请再次填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">手机号码</label>
				<div class="controls">
					<input type="text" class="{required:true,mobile:true}" name="mobile" placeholder="请填写手机号" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">email</label>
				<div class="controls">
					<input type="text" class="{required:true,email:true}" name="email" placeholder="请填写email" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">年龄</label>
				<div class="controls">
					<input type="text" class="{required:true,min: 18,max:100}" name="age" placeholder="请填写" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<hr />
			以下是否使用了jquery select2框架美化select控件的效果
			<hr />
			<div class="control-group">
				<label class="control-label">职位(默认下拉框)</label>
				<div class="controls">
					<select name="position" id="position" class="{required:true}">
						<option value="">选择职位</option>
						<option value="1">程序员</option>
						<option value="2">销售员</option>
						<option value="3">服务员</option>
						<option value="4">工人</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">爱好(使用select2)</label>
				<div class="controls">
					<select name="hobby" id="hobby" class="{required:true}">
						<option value="">选择爱好</option>
						<option value="1">登山</option>
						<option value="2">游泳</option>
						<option value="3">音乐</option>
						<option value="4">读书</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>
			
			<div class="form-actions">
				<button type="submit" class="btn btn-primary">保存</button>
				<button type="button" class="btn">重置</button>
			</div>
		</form>
		
		</fieldset>
		
		<script type="text/javascript" src="jquery/jquery-1.9.0.min.js" ></script>
		<script type="text/javascript" src="bootstrap/js/bootstrap.min.js" ></script>
		<script type="text/javascript" src="js/jquery.metadata.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.methods.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.cn.js" ></script>
		<!-- 引入jquery select2 -->
		<script type="text/javascript" src="jquery-select2/3.4/select2.min.js" ></script>
		<script type="text/javascript">
			$(function(){
				$("#registerForm").validate({
				  	submitHandler:function(form){
						form.submit();
					}
				});
				//select2美化下拉框控件
				$("#hobby").select2();
				/** 添加事件 */
				$("#hobby").change(function(){
			        $(this).valid();
			    });

			})
			
		</script>
	</body>
</html>

 

情况2:select2美化后的select控件中未使用验证属性( class="{required:true}"):

项目中是这种情况,下拉框不使用class属性验证(或者样式有冲突导致验证失效等问题),但是又必须选择相关的内容才能提交。网上所找到的问题大部分是这样的

通过查阅资料,知道了问题所在:

1、使用select2美化select下拉列表后,select2会把原来的select隐藏掉,设置css属性(display:none),然后再通过select2重新定制界面

2、但jquery.validate.js默认不是校验:hidden属性的控件,所以造成原来的select校验不了

官网说明:

ignore (default: ":hidden")

Type: Selector

Elements to ignore when validating, simply filtering them out. jQuery's not-method is used, therefore everything that is accepted by not() can be passed as this option. Inputs of type submit and reset are always ignored, so are disabled elements.

Example: Ignores all elements with the class "ignore" when validating.

$("#myform").validate({

  ignore: ".ignore"

});

3、解决方法就是加ignore属性,把值设置为""空字符串

ignore: "",

4、设置ignore后在提交时就会对隐藏的属性进行校验,但选择的时候没有进行实时校验,因为你选择的是select2。所以要给select加一个change事件,当改变时,再校验一次。

/** 添加事件 */
$("#hobby").change(function(){
	$(this).valid();
});

需要注意的是:valid方法是jquery.validate.js中的方法,所以用的时候,要先调用初始化方法validate( ),

然后在后面再重新调用valid()校验方法。

valid( )  可以校验整个表单,也可以校验单个属性。

官网说明:

valid( )  

Returns: Boolean

Description: Checks whether the selected form is valid or whether all selected elements are valid.

validate() needs to be called on the form before checking it using this method. 

项目中解决办法:

给select控件添加change事件:

//select2美化下拉框控件
$("#hobby").select2();
/** 添加事件 */
$("#hobby").change(function(){
	$(this).valid();
});

表单验证函数添加相应的代码即可:

$("#registerForm").validate({
	ignore: "",//添加ignore属性,会校验隐藏域的内容,setlet2下拉控件会替换原来的select(原来的select会隐藏)
	errorClass : 'error',
	focusInvalid : true,
	rules : {
		hobby : {
		    required : true
		}
	},
	messages : {
		hobby : {
			required : "请选择您的爱好"
		}
	},
	submitHandler:function(form){
		form.submit();
	}
});

解决后效果图:

源码(index3.html):

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>jquery.validate.js校验select2框架失效</title>
		<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css" />
		<!-- sdfdsf-->
		<link href="jquery-select2/3.4/select2.min.css" type="text/css" rel="stylesheet" />
		<style type="text/css">
		/** 
		 * 重新定义错误样式及图标
		 * 1、防止与bootstrap样式中的label冲突 (label: display: block),导致label换行了
		 * 2、添加错误图标显示 
		 */	
		.requiedField{
			color: red;
		}
		label {
		    display: inline-block;
		    margin-bottom: 0;
		}	
		label.error {
		    background: url(./img/unchecked.gif) no-repeat 5px 3px;
		    padding-left: 24px;
		    color: #EA5200;
		}	
		
		</style>
	</head>
	<body>
		<fieldset >
			<legend>用户注册</legend>
		<form class="form-horizontal" id="registerForm" method="post" onsubmit="return false;">
			<div class="control-group">
				<label class="control-label">昵称</label>
				<div class="controls">
					<input type="text" class="{required:true}" name="nickname" placeholder="请填写昵称" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称2</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:2}" name="nickname2" placeholder="请填写昵称2" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">昵称3</label>
				<div class="controls">
					<input type="text" class="{required:true,maxlength:10}" name="nickname3" placeholder="请填写昵称3" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">用户名</label>
				<div class="controls">
					<input type="text" class="{required:true,username:true,minLength:6,maxlength:20}" name="username" placeholder="请填写用户名" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">密码</label>
				<div class="controls">
					<input type="text" class="{required:true,minlength:6,maxlength:20}" id="password" name="password" placeholder="请填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">确认密码</label>
				<div class="controls">
					<input type="text" class="{required:true,equalTo:'#password'}" name="confirmPassword" placeholder="请再次填写密码" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">手机号码</label>
				<div class="controls">
					<input type="text" class="{required:true,mobile:true}" name="mobile" placeholder="请填写手机号" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">email</label>
				<div class="controls">
					<input type="text" class="{required:true,email:true}" name="email" placeholder="请填写email" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">年龄</label>
				<div class="controls">
					<input type="text" class="{required:true,min: 18,max:100}" name="age" placeholder="请填写" />
					<label class="requiedField">*</label>
				</div>
			</div>
			<hr />
			以下是否使用了jquery select2框架美化select控件的效果
			<hr />
			<div class="control-group">
				<label class="control-label">职位(默认下拉框)</label>
				<div class="controls">
					<select name="position" id="position" class="{required:true}">
						<option value="">选择职位</option>
						<option value="1">程序员</option>
						<option value="2">销售员</option>
						<option value="3">服务员</option>
						<option value="4">工人</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>
			<div class="control-group">
				<label class="control-label">爱好(使用select2)</label>
				<div class="controls">
					<select name="hobby" id="hobby">
						<option value="">选择爱好</option>
						<option value="1">登山</option>
						<option value="2">游泳</option>
						<option value="3">音乐</option>
						<option value="4">读书</option>
						<option value="5">其他</option>
					</select>
					<label class="requiedField">*</label>
				</div>
			</div>
			
			<div class="form-actions">
				<button type="submit" class="btn btn-primary">保存</button>
				<button type="button" class="btn">重置</button>
			</div>
		</form>
		
		</fieldset>
		
		<script type="text/javascript" src="jquery/jquery-1.9.0.min.js" ></script>
		<script type="text/javascript" src="bootstrap/js/bootstrap.min.js" ></script>
		<script type="text/javascript" src="js/jquery.metadata.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.methods.js" ></script>
		<script type="text/javascript" src="js/jquery.validate.cn.js" ></script>
		<!-- 引入jquery select2 -->
		<script type="text/javascript" src="jquery-select2/3.4/select2.min.js" ></script>
		<script type="text/javascript">
			$(function(){
				$("#registerForm").validate({
					ignore: "",//添加ignore属性,会校验隐藏域的内容,setlet2下拉控件会替换原来的select(原来的select会隐藏)
					errorClass : 'error',
					focusInvalid : true,
					rules : {
						hobby : {
							required : true
						}
					},
					messages : {
						hobby : {
							required : "请选择您的爱好"
						}
					},
				  	submitHandler:function(form){
						form.submit();
					}
				});
				
				//select2美化下拉框控件
				$("#hobby").select2();
				/** 添加事件 */
				$("#hobby").change(function(){
			        $(this).valid();
			    });

			})	
		</script>
	</body>
</html>

源码已经打包到百度云盘,下载地址:

链接:https://pan.baidu.com/s/1-hrUKQf8m45H3oQWsbpgvQ 
提取码:s1dl


部分内容参考下面这篇文章:

https://blog.csdn.net/hyb1234hi/article/details/51474126

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值