bootstrap校驗(yàn)laydate起止日期聯(lián)動(dòng)失效問(wèn)題及解決方法
項(xiàng)目場(chǎng)景:
提示:這里簡(jiǎn)述項(xiàng)目相關(guān)背景:
項(xiàng)目中用到bootstrapValidator,以及l(fā)aydate(by:賢心,插件效果美觀)。
項(xiàng)目表單中,有兩處需要聯(lián)動(dòng)校驗(yàn):開(kāi)始日期,結(jié)束日期。
規(guī)則:兩項(xiàng)必填,開(kāi)始日期不能晚于結(jié)束日期
問(wèn)題描述
提示:這里描述項(xiàng)目中遇到的問(wèn)題:
因?yàn)槭褂玫耐獠坎寮?,在調(diào)試過(guò)程中出現(xiàn)以下問(wèn)題:
1.單獨(dú)綁定input變化監(jiān)聽(tīng)觸發(fā)校驗(yàn)失效
<input type="text" class="form-control" id="startTime" name="startTime" autocomplete="off">
//綁定使用laydate元素
laydate.render({
elem:'#startTime',
type:'date',
trigger:'click',
done:function(){
}
})
laydate.render({
elem:'#endTime',
type:'date',
trigger:'click',
done:function(){
}
})
$("#startTime").bind("change",function(){//嘗試手動(dòng)觸發(fā)聯(lián)動(dòng)校驗(yàn)
$("#dataForm").data("bootstrapValidator").validateField("startTime");//校驗(yàn)結(jié)果無(wú)任何反饋
$("#dataForm").data("bootstrapValidator").validateField("endTime");//校驗(yàn)結(jié)果無(wú)任何反饋
})2.在laydate回調(diào)函數(shù)中手動(dòng)設(shè)置校驗(yàn)有效,但校驗(yàn)不通過(guò)后修改值和提交按鈕校驗(yàn)都沒(méi)反應(yīng)
laydate.render({
elem:'#startTime',
type:'date',
trigger:'click',
done:function(){//手動(dòng)觸發(fā)聯(lián)動(dòng)校驗(yàn)
$("#dataForm").data("bootstrapValidator").validateField("startTime");
$("#dataForm").data("bootstrapValidator").validateField("endTime");
}
})
$("#subForm").click(()=>{
$("#dataForm").data('bootstrapValidator').validate();//不起作用
})解決方案:
在回調(diào)函數(shù)中增加重置校驗(yàn)
完整代碼(“關(guān)鍵代碼”已在注釋中標(biāo)出)
1、自定義bootstrapValidator.extend.js文件
$(document).ready(function(){
$.fn.bootstrapValidator.i18n.orderRange = $.extend($.fn.bootstrapValidator.i18n.orderRange || {}, {
'default':''
});
$.fn.bootstrapValidator.validators.checkStartDate = {//起始日期不晚于結(jié)束日期
validate:function(validator,$field,options){
var value = $field.val();
if($("#endTime").val().trim() < value){
return false
}else{
return true
}
}
};
$.fn.bootstrapValidator.validators.checkEndDate = {//結(jié)束日期不早于起始日期
validate:function(validator,$field,options){
var value = $field.val();
if($("#startTime").val().trim() > value){
return false
}else{
return true
}
}
}
})2、html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<!--以下為主要引入文件-->
<link rel="stylesheet" href="./css/bootstrap.min.css">
<link rel="stylesheet" href="./css/bootstrapValidator.min.css">
<script src="./js/jquery.min.js"></script>
<script src="./js/laydate/laydate.js"></script>
<script src="./js/bootstrap.min.js"></script>
<script src="./js/bootstrapValidator.min.js"></script>
<script src="./js/bootstrapValidator.extend.js"></script>
</head>
<body>
<form class="form" id="dataForm">
<!--對(duì)比組,檢查整體校驗(yàn)是否生效-->
<div class="form-group">
<label>名稱(chēng):</label>
<input type="text" class="form-control" name="devName" id="devName"/>
</div>
<!--聯(lián)動(dòng)組-->
<div class="form-group">
<label>開(kāi)始日期:</label>
<input type="date" class="form-control" name="startTime" id="startTime"/>
</div>
<div class="form-group">
<label>結(jié)束日期:</label>
<input type="date" class="form-control" name="endTime" id="endTime"/>
</div>
</form>
<button id="subForm">提交</button>
</body>
<script>
function initDataForm(){//初始化校驗(yàn)規(guī)則
$("#dataForm").bootstrapValidator({
fields:{
devName:{
validators:{
notEmpty:{
message:"必填項(xiàng)不能為空"
}
}
},
startTime:{
validators:{
notEmpty:{
message:"必填項(xiàng)不能為空"
},
checkStartDate:{
message:"開(kāi)始日期不能晚于結(jié)束日期"
}
}
},
endTime:{
validators:{
notEmpty:{
message:"必填項(xiàng)不能為空"
},
checkStartDate:{
message:"結(jié)束日期不能早于開(kāi)始日期"
}
}
}
}
})
}
initDataForm();
laydate.render({
elem:'#startTime',
type:'date',
trigger:'click',
done:function(){
$('#dataForm').data("bootstrapValidator").resetField("startTime");//關(guān)鍵代碼
$('#dataForm').data("bootstrapValidator").resetField("endTime");//關(guān)鍵代碼
$("#dataForm").data("bootstrapValidator").validateField("startTime");
$("#dataForm").data("bootstrapValidator").validateField("endTime");
}
})
laydate.render({
elem:'#endTime',
type:'date',
trigger:'click',
done:function(){
$('#dataForm').data("bootstrapValidator").resetField("startTime");//關(guān)鍵代碼
$('#dataForm').data("bootstrapValidator").resetField("endTime");//關(guān)鍵代碼
$("#dataForm").data("bootstrapValidator").validateField("startTime");
$("#dataForm").data("bootstrapValidator").validateField("endTime");
}
})
$("#subForm").click(()=>{
$("#dataForm").data('bootstrapValidator').validate();
})
</script>
分析:
本例使用到的各版本(css版本省略):
| jquery.min.js | bootstrap.min.js | bootstrapValidator.min.js | laydate.js |
|---|---|---|---|
| v2.1.4 | v3.3.7 | v0.5.3 | v5.0.9 |
在發(fā)現(xiàn)校驗(yàn)無(wú)法生效后查找了多方面的資料,也用原生的<input type="datatime"/>試驗(yàn)過(guò),個(gè)人感覺(jué),單獨(dú)使用代碼主動(dòng)觸發(fā)校驗(yàn)?zāi)稠?xiàng)后,這一項(xiàng)在值改變后不會(huì)重復(fù)校驗(yàn)。
操作順序:
①點(diǎn)“提交”按鈕
②開(kāi)始日期報(bào)“必填項(xiàng)不能為空”
③開(kāi)始日期和結(jié)束日期填入合法值或非法值
結(jié)果:無(wú)論第③步是否輸入合理,輸入框下的錯(cuò)誤提示依舊是“必填項(xiàng)不能為空”
需要重置之前的校驗(yàn)狀態(tài)。

通過(guò)在觸發(fā)校驗(yàn)代碼處添加前置語(yǔ)句,完美解決了這個(gè)問(wèn)題:
$('#dataForm').data("bootstrapValidator").resetField("startTime");//關(guān)鍵代碼
$('#dataForm').data("bootstrapValidator").resetField("endTime");//關(guān)鍵代碼
$("#dataForm").data("bootstrapValidator").validateField("startTime");
$("#dataForm").data("bootstrapValidator").validateField("endTime");
可能引入版本不同的原因,我只有resetField和validateField方式才有效
網(wǎng)上還有其他寫(xiě)法,或許在其他版本下會(huì)生效,請(qǐng)參考:
重置狀態(tài)寫(xiě)法:
$("#dateForm").bootstrapValidator("updateStatus",$("#startTime"),"VALID");
//(此寫(xiě)法我本地不起作用)或
$("#dateForm").data("bootstrapValidator").updateStatus("startTime","VALID");//此寫(xiě)法我本地報(bào)錯(cuò)updateStatus is not a function手動(dòng)觸發(fā)校驗(yàn)寫(xiě)法:
$("#dataForm").validator($("#startTime"));//此寫(xiě)法我本地報(bào)錯(cuò)validator is not a function補(bǔ)充:
還有一種方式,通過(guò)修改css來(lái)實(shí)現(xiàn)模擬聯(lián)動(dòng),但是在此例中不適用。
- 對(duì)于laydate插件:不會(huì)主動(dòng)觸發(fā)校驗(yàn),只能在
done中寫(xiě)主動(dòng)校驗(yàn)代碼,然后在輸入框內(nèi)容變化時(shí)才能校驗(yàn)。如果不加重置校驗(yàn)狀態(tài)語(yǔ)句,出現(xiàn)第一次校驗(yàn)不通過(guò)后將無(wú)法進(jìn)行二次校驗(yàn)。 - 對(duì)于瀏覽器自帶的
<input type="date">,輸入框值變化,可觸發(fā)校驗(yàn),但是不靈敏(比如,開(kāi)始選:2023年1月15日,結(jié)束選2023年1月10日,此時(shí)開(kāi)始報(bào)“不能晚于結(jié)束日期”,再將結(jié)束選到2023年1月18日,但開(kāi)始框的紅色警告依然存在,只有開(kāi)始日期重選一遍,底下紅色警告才消失),所以,也同樣需要加重置校驗(yàn)狀態(tài)語(yǔ)句+代碼觸發(fā)關(guān)聯(lián)框校驗(yàn),才能實(shí)現(xiàn)聯(lián)動(dòng)的效果
到此這篇關(guān)于bootstrap校驗(yàn)laydate起止日期聯(lián)動(dòng)失效的文章就介紹到這了,更多相關(guān)bootstrap校驗(yàn)laydate日期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序scroll-view實(shí)現(xiàn)自定義滾動(dòng)條
這篇文章主要為大家詳細(xì)介紹了微信小程序scroll-view實(shí)現(xiàn)自定義滾動(dòng)條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
javascript實(shí)現(xiàn)根據(jù)時(shí)間段顯示問(wèn)候語(yǔ)的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)根據(jù)時(shí)間段顯示問(wèn)候語(yǔ)的方法,涉及javascript時(shí)間與字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06
簡(jiǎn)單了解微信小程序的目錄結(jié)構(gòu)
這篇文章主要介紹了簡(jiǎn)單了解小程序的目錄結(jié)構(gòu),在開(kāi)發(fā)小程序之前,我們首先需要對(duì)其目錄結(jié)構(gòu)進(jìn)行了解,以便于提升開(kāi)發(fā)效率,需要的朋友可以參考下2019-07-07
JavaScript?ES6中class定義類(lèi)實(shí)例方法
ES6提供了更接近面向?qū)ο?注意:javascript本質(zhì)上是基于對(duì)象的語(yǔ)言)語(yǔ)言的寫(xiě)法,引入了Class(類(lèi))這個(gè)概念,作為對(duì)象的模板,下面這篇文章主要給大家介紹了關(guān)于JavaScript?ES6中class定義類(lèi)的相關(guān)資料,需要的朋友可以參考下2022-07-07
javascript實(shí)現(xiàn)倒計(jì)時(shí)N秒后網(wǎng)頁(yè)自動(dòng)跳轉(zhuǎn)代碼
這篇文章主要介紹了javascript實(shí)現(xiàn)倒計(jì)時(shí)N秒后網(wǎng)頁(yè)自動(dòng)跳轉(zhuǎn)代碼,非常的實(shí)用,這里推薦給大家。2014-12-12
JavaScript實(shí)現(xiàn)小球沿正弦曲線運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)小球沿正弦曲線運(yùn)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
JavaScript地圖拖動(dòng)功能SpryMap的簡(jiǎn)單實(shí)現(xiàn)
SpryMap是一個(gè)獨(dú)立的并且是輕量級(jí)的JavaScript類(lèi)庫(kù),它不依賴于任何其他的JS框架2013-07-07

