CustomValid.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  1. /**
  2. * jquery自定义表单验证插件
  3. * 使用方法:
  4. * 在需要做验证的输入框,单选框,多选框,下拉框中加入validate属性
  5. * validate:写法如下:
  6. * {required:true,email:true,maxLength:50}
  7. * 如:
  8. * <input type="text" name="username" value="" validate="{required:true,maxlength:50}"/>
  9. * 注意一组单选框,或多选框 只需在其中一个input标记中 加入validate 属性
  10. * 如:
  11. * <input type="checkbox" name="a" value="1" validate="{required:true}" tipId="errorA"/>
  12. * <input type="checkbox" name="a" value="2" />
  13. * <input type="checkbox" name="a" value="3" />
  14. *
  15. * tipId:错误信息显示的容器ID,设置了这个属性后,错误信息会显示到该标签中。
  16. * <input type="text" name="name" validate="{required:true}" tipId="errorA"/><label id="errorA"></label>
  17. *
  18. *
  19. * 调用方式:
  20. *
  21. * $("a.save").click(function(){
  22. * var rtn=$("#shipOrderForm").form().valid();
  23. * if(rtn){
  24. * $("#shipOrderForm").submit();
  25. * }
  26. * });
  27. * 同时也可以扩展验证的规则
  28. * var rtn=$("#form").form({
  29. * //扩展验证规则 追加到已有的规则中
  30. * rules:[{
  31. * //规则名称
  32. * name:"QQ",
  33. * //判断方法 返回 true 或false
  34. * rule:function(v){
  35. * },
  36. * //错误的提示信息
  37. * msg:""
  38. *
  39. * }],
  40. * //显示的错误信息样式 element 当前验证的元素,msg:错误信息
  41. * errorPlacement:function(element,msg){
  42. * },
  43. * //成功后的样式 element 当前验证的元素
  44. * success:function(element){
  45. * },
  46. * excludes:":hidden"
  47. * }).valid()
  48. *
  49. * 扩展 : by xianggang
  50. * 1、如果需要弹出错误提示的具体信息 可以这样使用
  51. * var rtn=CustomForm.validate({returnErrorMsg:true});
  52. * 或者 $("form").valid({returnErrorMsg:true});
  53. * 其中form即为您要验证的表单或者域
  54. * if(!rtn.success){
  55. * $.ligerDialog.tipDialog($lang.tip.msg,"表单验证错误信息如下",rtn.errorMsg,null,function(){
  56. * $.ligerDialog.hide();
  57. * });
  58. * return;
  59. * }
  60. * 2、如果想要自定义错误提示信息 可以这样使用
  61. * <input type="text" name="NAME" lablename="名称" class="inputText"
  62. * validate="{maxlength:100,required:true,英文字母:true}"
  63. * errormsgtips="{maxlength:'不能超过100',required:'必须填写1',英文字母:'请输入英文字母'}" />
  64. * 其中的errormsgtips即为自定义错误提示信息的json对象。
  65. */
  66. (function($) {
  67. $.extend($.fn, {
  68. // 表单初始化,可以添加自定义规则,出错处理和成功后的处理。
  69. form : function(conf) {
  70. if (conf) {
  71. if (conf.errorPlacement) {
  72. this.errorPlacement = conf.errorPlacement;
  73. };
  74. if (conf.rules) {
  75. for (var i = 0, len = conf.rules.length; i < len; i++) {
  76. this.addRule(conf.rules[i]);
  77. }
  78. };
  79. if (conf.success) {
  80. this.success = conf.success;
  81. };
  82. if (conf.excludes) {
  83. this.excludes = conf.excludes;
  84. }
  85. }
  86. var form = this;
  87. form.delegate("input[validate],select[validate],textarea[validate]", "blur", function() {
  88. form.handValidResult(this);
  89. });
  90. form.delegate("input[validate],select[validate],textarea[validate]", "focus", function() {
  91. form.success(this);
  92. });
  93. //处理验证ckeditor
  94. $("[validate].ckeditor",form).each(function(){
  95. var me= $(this),name = me.attr("name");
  96. setTimeout(function(){//等待ckeditor渲染完成再进行处理
  97. var editor= CKEDITOR.instances[name],ck=me.next();
  98. if(editor){
  99. editor.on( 'blur', function(){
  100. form.handValidResult(me);
  101. });
  102. editor.on( "focus", function(){
  103. form.success(me);
  104. });
  105. }
  106. },1000);
  107. })
  108. return this;
  109. },
  110. // 添加验证规则。
  111. // 扩展规则和现有的规则名称相同,则覆盖,否则添加。
  112. addRule : function(rule) {
  113. var len = this.rules.length;
  114. for (var i = 0; i < len; i++) {
  115. var r = this.rules[i];
  116. if (rule.name == r.name) {
  117. this.rules[i] = rule;
  118. return;
  119. }
  120. }
  121. this.rules.push(rule);
  122. },
  123. /**
  124. * 判断元素是否在不需要校验的范围内。
  125. */
  126. isInNotValid : function(obj) {
  127. //在fieldControl.flt的文件上传中的textarea添加属性validatable,为true表示在验证范围内
  128. if($(obj).is(":hidden")){
  129. if($(obj).attr("validatable")!="true"){
  130. return true;
  131. }
  132. }
  133. if (!this.excludes)
  134. return false;
  135. var scope = $(this.excludes, this);
  136. var aryInput = $(
  137. "input:text,input:hidden,textarea,select,input:checkbox,input:radio",
  138. scope);
  139. for (var i = 0, len = aryInput.length; i < len; i++) {
  140. var tmp = aryInput.get(i);
  141. if (obj == tmp) {
  142. return true;
  143. }
  144. }
  145. return false;
  146. },
  147. // 对所有有validate表单控件进行验证。
  148. valid : function(conf) {
  149. if(!conf){
  150. this.ignoreRequired=false;
  151. }
  152. else{
  153. if(conf.ignoreRequired==undefined){
  154. this.ignoreRequired=false;
  155. }
  156. else{
  157. this.ignoreRequired=conf.ignoreRequired;
  158. }
  159. }
  160. var _v = true, form = this,msgs={};
  161. $('[validate]', form).each(function() {
  162. var returnObj = form.handValidResult(this);
  163. for(var i in returnObj){
  164. if (i=="success"&&!returnObj.success)
  165. _v = false;
  166. else
  167. msgs[i]=returnObj[i];
  168. }
  169. });
  170. if(conf&&conf.returnErrorMsg){
  171. var returnTextObj={};
  172. if(!_v){
  173. var errorMsg="<div>";
  174. var i=1;
  175. for(var m in msgs){
  176. if(m=="success")continue;
  177. errorMsg=errorMsg+(i++)+"、<span style='color:rgb(136, 10, 10);font-weight: bolder;'>"+
  178. m+"&nbsp&nbsp</span> <span style='color:red;'>"+msgs[m]+"</span></br>";
  179. }
  180. errorMsg+="</div>"
  181. }
  182. returnTextObj.success=_v;
  183. returnTextObj.errorMsg=errorMsg;
  184. return returnTextObj;
  185. }
  186. return _v;
  187. },
  188. // 显示表单处理结果
  189. handValidResult : function(obj) {
  190. //判断验证的控件是否是a标签,是的不处理,直接返回
  191. var isATag=$(obj).is("a");
  192. if(isATag) return;
  193. // 是否在不需要验证的范围内,在的话就不需要验证。
  194. var returnObj={};
  195. if (this.isInNotValid(obj)){
  196. returnObj.success=true;
  197. return returnObj;
  198. }
  199. var msg = this.validEach(obj);
  200. if (msg != '') {
  201. this.errorPlacement(obj, msg);
  202. returnObj.success=false;
  203. var opinionReg = /.*:.*:(.*)|opinion:(.*)/.exec($(obj).attr("name"));
  204. if(opinionReg&&opinionReg.length==2){
  205. var lableName = "";
  206. var lableTemp = $(obj).attr("lablename");
  207. if(lableTemp){
  208. lableName = lableTemp;
  209. }else{
  210. var title = $(obj).parents("tr").children("td.formTitle").text();
  211. title=title.replaceAll(":","");
  212. if(title)lableName = title;
  213. }
  214. var msgName=/.*:.*:(.*)|opinion:(.*)/.exec($(obj).attr("name"))[1]+" ("+lableName+")";
  215. returnObj[msgName]=msg;
  216. }
  217. return returnObj;
  218. } else {
  219. this.success(obj);
  220. if($(obj).hasClass('validError')){ //引对子表单的
  221. $(obj).removeClass('validError');
  222. }
  223. returnObj.success=true;
  224. return returnObj;
  225. }
  226. },
  227. // 验证单个控件。
  228. validEach : function(obj) {
  229. var element = $(obj),
  230. rules = this.rules,
  231. validRule = element.attr('validate'),
  232. value = "",
  233. name = element.attr("name");
  234. // 处理单选框和多选框
  235. if(element.is(":checkbox,:radio")) {
  236. var parentObj = element.closest("[formtype]"),
  237. brotherObjs = (parentObj&&parentObj.length>0)?$(":checked[name='" + name + "']",parentObj):$(":checked[name='" + name + "']");
  238. brotherObjs.each(function() {
  239. if (value == "") {
  240. value = $(this).val();
  241. } else {
  242. value += "," + $(this).val();
  243. }
  244. });
  245. }else if (element.is("select")) {// 处理select
  246. value = element.find("option:selected").val();
  247. if(typeof(value)==undefined || value==null || $.trim(value) == '' || value.indexOf("请选择")>-1){
  248. value = '';
  249. }
  250. }else if (element.hasClass("ckeditor") ) {// 处理ckeditor编辑器
  251. var editor= CKEDITOR.instances[name];
  252. if($.isEmpty(editor))//ckeditor没渲染的,则取textarea的值
  253. value = element.val();
  254. else
  255. value = editor.getData();
  256. }else if(element.hasClass("selectFile")){//处理附件
  257. value = element.siblings("textarea[controltype='attachment']").val();
  258. }else if(element.hasClass("dicComboBox")||element.hasClass("dicComboTree")||element.hasClass("dicCombo")){ //处理数据字典
  259. var textboxname = element.attr("textboxname");
  260. if(!textboxname)
  261. textboxname = element.attr("name").replaceAll(":","") +"_id";// 修改bug,但是去除字符的有问题
  262. value = element.parents("td.formInput").find("input[name='"+textboxname+"']").val();
  263. }else {
  264. value = element.val();
  265. }
  266. // 处理值
  267. value = value == null ? "" : value.trim();
  268. // 获取json。
  269. var json = eval('(' + validRule + ')');
  270. var isRequired = json.required;
  271. // 非必填的字段且值为空 那么直接返回成功。
  272. if ((isRequired == false || isRequired == undefined) && value == "")
  273. return "";
  274. //忽略必填规则。
  275. if(this.ignoreRequired==true && value == "") return "";
  276. // 遍历json规则。
  277. for (var name in json) {
  278. var validValue = json[name];
  279. //验证规则
  280. var msg = this._validRules({
  281. rules:rules,//规则json
  282. ruleName:name,// 规则名称
  283. validValue:validValue,//验证的值
  284. value:value,//实际的值
  285. errormsgtips:element.attr("errormsgtips"),
  286. element:element
  287. });
  288. if (msg != '')
  289. return msg;
  290. }
  291. return "";
  292. },
  293. /**
  294. * 验证规则
  295. **/
  296. _validRules :function(conf){
  297. var _valid = true,
  298. rules = conf.rules,//规则json
  299. ruleName = conf.ruleName,// 规则名称
  300. validValue = conf.validValue,//验证的值
  301. value =conf.value,//实际的值
  302. element = conf.element;//当前对象
  303. try{
  304. //处理当element为货币时,value会类似:¥10.00 但这事实上应该是数字
  305. // 所以需要处理一下value,让其变成 10.00
  306. var str=$(element).attr('showtype').replace(new RegExp("'","gm"),"\"");
  307. var cv=JSON.parse(str).coinValue;
  308. if(value.startWith("+"+cv)||value.startWith("-"+cv)||value.startWith(cv)){
  309. value=value.replace(cv,"");
  310. }
  311. }catch(e){}
  312. for (var m = 0; m < rules.length; m++) {
  313. // 取得验证规则。
  314. var rule = rules[m];
  315. if (ruleName.toLowerCase() != rule.name.toLowerCase()) continue;
  316. // 验证规则如下:
  317. // email:true,url:true.
  318. //验证规则是boolean类型
  319. if ($.type(validValue) === "boolean")
  320. _valid = (!rule.rule(value) && validValue == true) ? false:true;
  321. else
  322. _valid = rule.rule(value, validValue,element);
  323. if (!_valid){ //验证不通过返回消息
  324. var errorMsg=rule.msg;
  325. if(conf.errormsgtips){
  326. var errormsgtips=eval("("+conf.errormsgtips.replaceAll("'","\"")+")")
  327. for(var i in errormsgtips){
  328. if(i==ruleName){
  329. errorMsg=errormsgtips[i];
  330. break;
  331. }
  332. }
  333. }
  334. return this.format(errorMsg, validValue);
  335. }
  336. }
  337. return "";
  338. },
  339. /**
  340. * 消息格式化
  341. **/
  342. format:function(msg,args){
  343. //boolean类型的直接返回
  344. if ($.type(args) === "boolean")
  345. return msg;
  346. if (!$.isArray(args)) //不是数组类型的
  347. args = [args];
  348. //数组类型的
  349. $.each(args,function(d, e) {
  350. msg = msg.replace(RegExp("\\{" + d + "\\}", "g"), e)
  351. });
  352. return msg;
  353. },
  354. // 错误显示位置。
  355. errorPlacement : function(element, msg) {
  356. var errorId = $(element).attr("tipId");
  357. if (errorId) {
  358. $('#' + errorId).find('label.error').remove();
  359. $('#' + errorId).append($('<label class="error">' + msg
  360. + '</label>'));
  361. return;
  362. }
  363. var parent =$(element).parent();
  364. parent.find('label.error').remove();
  365. parent.append($('<label class="error">' + msg
  366. + '</label>'));
  367. },
  368. // 验证成功时,删除错误提示信息。
  369. success : function(element) {
  370. var errorId = $(element).attr("tipId");
  371. if (errorId) {
  372. $('#' + errorId).find('label.error').remove();
  373. return;
  374. }
  375. $(element).parent().find('label.error').remove();
  376. },
  377. // 内置的规则。
  378. rules : [{
  379. name : "required",
  380. rule : function(v) {
  381. if (v == "" || v.length == 0)
  382. return false;
  383. return true;
  384. },
  385. msg : $lang_js.customValid.rules.required
  386. }, {
  387. name : "number",
  388. rule : function(v) {
  389. return /^-?((\d{1,3}(,\d{3})+?|\d+)(\.\d{1,5})?)$/
  390. .test(v.trim());
  391. },
  392. msg : $lang_js.customValid.rules.number
  393. }, {
  394. name : "variable",
  395. rule : function(v) {
  396. return /^[A-Za-z_0-9]*$/gi.test(v.trim());
  397. },
  398. msg : $lang_js.customValid.rules.variable
  399. }, {
  400. name : "fields",
  401. rule : function(v){
  402. return /^[A-Za-z]{1}([a-zA-Z0-9_]{1,17})?$/gi.test(v.trim());
  403. },
  404. msg : $lang_js.customValid.rules.fields
  405. },{
  406. name : "minLength",
  407. rule : function(v, b) {
  408. return (v.length >= b);
  409. },
  410. msg : $lang_js.customValid.rules.minLength
  411. }, {
  412. name : "maxLength",
  413. rule : function(v, b) {
  414. return (v.trim().replace(/[^x00-xFF]/g,'**').length <= b);
  415. },
  416. msg : $lang_js.customValid.rules.maxLength
  417. }, {
  418. name : "rangeLength",
  419. rule : function(v, args) {
  420. return (v.trim().length >= args[0] && v.trim().length <= args[1]);
  421. },
  422. msg : $lang_js.customValid.rules.rangeLength
  423. },{
  424. name : "officephone",
  425. rule : function(v) {
  426. return /^(0\d{2,3}-?)?\d{7,8}$/
  427. .test(v.trim());
  428. },
  429. msg : "请输入正确的办公电话号码"
  430. }, {
  431. name : "phone",
  432. rule : function(v) {
  433. return /^0?1[3|4|5|8][0-9]\d{8}$/
  434. .test(v.trim());
  435. },
  436. msg : "请输入正确的移动电话号码"
  437. }, {
  438. name : "email",
  439. rule : function(v) {
  440. return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
  441. .test(v.trim());
  442. },
  443. msg : $lang_js.customValid.rules.email
  444. }, {
  445. name : "url",
  446. rule : function(v) {
  447. return /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i
  448. .test(v.trim());
  449. },
  450. msg : $lang_js.customValid.rules.url
  451. }, {
  452. name : "date",
  453. rule : function(v) {
  454. var re = /^[\d]{4}-[\d]{1,2}-[\d]{1,2}\s*[\d]{1,2}:[\d]{1,2}:[\d]{1,2}|[\d]{4}-[\d]{1,2}-[\d]{1,2}|[\d]{1,2}:[\d]{1,2}:[\d]{1,2}$/g
  455. .test(v.trim());
  456. return re;
  457. },
  458. msg : $lang_js.customValid.rules.date
  459. }, {
  460. name : "digits",
  461. rule : function(v) {
  462. return /^\d+$/.test(v.trim());
  463. },
  464. msg : $lang_js.customValid.rules.digits
  465. }, {
  466. name : "equalTo",
  467. rule : function(v, b) {
  468. var a = $("#" + b).val();
  469. return (v.trim() == a.trim());
  470. },
  471. msg : $lang_js.customValid.rules.equalTo
  472. }, {
  473. name : "range",
  474. rule : function(v, args) {
  475. return v <= args[1] && v >= args[0];
  476. },
  477. msg : $lang_js.customValid.rules.range
  478. }, {
  479. name : "maxvalue",
  480. rule : function(v, max) {
  481. return v <= max;
  482. },
  483. msg : $lang_js.customValid.rules.maxvalue
  484. },{
  485. name : "minvalue",
  486. rule : function(v, min) {
  487. return v >= min;
  488. },
  489. msg :$lang_js.customValid.rules.minvalue
  490. },{
  491. // 判断数字整数位
  492. name : "maxIntLen",
  493. rule : function(v, b) {
  494. return (v + '').split(".")[0].replaceAll(",","").length <= b;
  495. },
  496. msg : $lang_js.customValid.rules.maxIntLen
  497. }, {
  498. // 判断数字小数位
  499. name : "maxDecimalLen",
  500. rule : function(v, b) {
  501. return (v + '').replace(/^[^.]*[.]*/, '').length <= b;
  502. },
  503. msg : $lang_js.customValid.rules.maxDecimalLen
  504. }, {
  505. /**
  506. * 判断日期开始范围{dateRangeStart:{
  507. * target:'endXXX',
  508. * mode:'name',
  509. * range:''
  510. * }}
  511. * target:查找对象 结束时间的日期对象(必填)
  512. * mode:查找方式(默认是:name) 【可选值:id,name,class】
  513. * range:查找范围(默认是‘’,查找所有body) 【可选值:'',main,sub】
  514. * </br>
  515. * 支持旧版的id查找 dateRangeStart:'xxxID' //结束时间的日期对象ID
  516. *
  517. */
  518. name : "dateRangeStart",
  519. rule : function(v, b,e) {
  520. if(!$.isPlainObject(b))
  521. b = { target:b,mode:'id'};
  522. var target = b.target,//查找对象
  523. mode = b.mode?b.mode:'name',//查找方式
  524. range = b.range?b.range:'';//查找范围
  525. val ='';
  526. if(mode == 'name'){
  527. if(range =="" || range =="main" ){//空或者主表
  528. val = $("[name='" +target+"']").val();
  529. }else if(range ="sub"){//子表
  530. val = $(e).closest('[formtype]').find("[name='" +target+"']").val();
  531. }
  532. }else if(mode == 'id'){
  533. if(range =="" || range =="main" ){//空或者主表
  534. val = $("#" +target).val();
  535. }else if(range ="sub"){//子表
  536. val = $(e).closest('[formtype]').find("#" +target).val();
  537. }
  538. }else{
  539. if(range =="" || range =="main" ){//空或者主表
  540. val = $("." +target).val();
  541. }else if(range ="sub"){//子表
  542. val = $(e).closest('[formtype]').find("." +target).val();
  543. }
  544. }
  545. return daysBetween(val, v);
  546. },
  547. msg : $lang_js.customValid.rules.dateRangeStart
  548. }, {
  549. /**
  550. * 判断日期开始范围{dateRangeStart:{
  551. * target:'startXXX',
  552. * mode:'name',
  553. * range:''
  554. * }}
  555. * target:查找对象 开始时间的日期对象(必填)
  556. * mode:查找方式(默认是:name) 【可选值:id,name,class】
  557. * range:查找范围(默认是‘’,查找所有body) 【可选值:'',main,sub】
  558. * </br>
  559. * 支持旧版的id查找 dateRangeStart:'xxxID' //开始时间的日期对象ID
  560. *
  561. */
  562. name : "dateRangeEnd",
  563. rule : function(v,b,e) {
  564. if(!$.isPlainObject(b))
  565. b = { target:b,mode:'id'};
  566. var target = b.target,//查找对象
  567. mode = b.mode?b.mode:'name',//查找方式
  568. range = b.range?b.range:'';//查找范围
  569. val ='';
  570. if(mode == 'name'){
  571. if(range =="" || range =="main" ){//空或者主表
  572. val = $("[name='" +target+"']").val();
  573. }else if(range ="sub"){//子表
  574. val = $(e).closest('[formtype]').find("[name='" +target+"']").val();
  575. }
  576. }else if(mode == 'id'){
  577. if(range =="" || range =="main" ){//空或者主表
  578. val = $("#" +target).val();
  579. }else if(range ="sub"){//子表
  580. val = $(e).closest('[formtype]').find("#" +target).val();
  581. }
  582. }else{
  583. if(range =="" || range =="main" ){//空或者主表
  584. val = $("." +target).val();
  585. }else if(range ="sub"){//子表
  586. val = $(e).closest('[formtype]').find("." +target).val();
  587. }
  588. }
  589. return daysBetween(v, val);
  590. },
  591. msg : $lang_js.customValid.rules.dateRangeEnd
  592. },
  593. {
  594. // 空的字段(永远通过验证,返回true) 防止在验证JSON中出现有多余的逗号
  595. name : "empty",
  596. rule : function(v, b) {
  597. // var start = $("#" + b).val();
  598. return true;
  599. },
  600. msg : ""
  601. },
  602. {
  603. // 不能以数字开头
  604. name : "noDigitsStart",
  605. rule : function(v) {
  606. return !/^(\d+)(.*)$/.test(v.trim());
  607. },
  608. msg : $lang_js.customValid.rules.noDigitsStart
  609. }, {
  610. name : "varirule",
  611. rule : function(v) {
  612. return /^[a-zA-Z]\w*$/.test(v.trim());
  613. },
  614. msg : "只能为字母开头,允许字母、数字和下划线"
  615. }, {
  616. //不能以数字开头
  617. name : "chNum",
  618. rule : function(v) {
  619. return /^[0-9\u4e00-\u9fa5]+$/.test(v.trim());
  620. [\u4e00-\u9fa5]
  621. },
  622. msg : "只允许输入中文和数字"
  623. }, {
  624. name : "chinese",
  625. rule : function(v) {
  626. return /[\u4e00-\u9fa5]/.test(v.trim());
  627. },
  628. msg : "只允许输入中文"
  629. }
  630. ]
  631. });
  632. })(jQuery);