fw.valid.js 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812
  1. /**
  2. * @author herong
  3. * 通用校验组件
  4. */
  5. var CFWValid = _FW.fCreateClass();
  6. /**
  7. * 通用校验组件
  8. */
  9. CFWValid.prototype = {
  10. /**
  11. * 初始化
  12. * */
  13. fInitialize : function(options) {
  14. },
  15. /**
  16. * 判断是否为正数或负数,如果不符合判断,则弹出提示对话框
  17. * @param Object oName (必需) 控件对象
  18. * @param int iFlag (必需) 正负标志:1 正数,-1 负数
  19. * <pre>
  20. * 使用举例:
  21. * CFW.oValid.fnZfpd(_iSz, 1);
  22. * </pre>
  23. */
  24. fnZfpd : function (oName,iFlag) {
  25. //入参为必需项,需要先进行非空校验。
  26. if(this.fnIsNull(oName,"CFW.oValid.fnZfpd 控件对象")){
  27. return;
  28. };
  29. var val = oName.value;
  30. var vldStr = oName.vldStr;
  31. var arr = vldStr.split("=");
  32. var name = arr[0];
  33. if(!this.fnIsFloat(val)) {
  34. CFW.oWin.fnAlert(name+"不为数字");
  35. return ;
  36. }
  37. if(!(iFlag == '1' || iFlag == '-1')) {
  38. CFW.oWin.fnAlert("正负判断标志不为1或-1");
  39. return ;
  40. }
  41. /*不能为负数*/
  42. if(iFlag == 1){
  43. if(val < 0){
  44. oName.value = '';
  45. CFW.oWin.fnAlert(name+"不能为负数");
  46. setTimeout(function(){oName.focus();},0);
  47. }
  48. }
  49. /*不能为正数*/
  50. if(iFlag == -1){
  51. if(val > 0){
  52. oName.value = '';
  53. CFW.oWin.fnAlert(name + "不能为正数");
  54. setTimeout(function(){oName.focus();},0);
  55. }
  56. }
  57. },
  58. /**
  59. * 判断输入是否为整数字
  60. * 主要是判断传入的字符串,是否为整数(0-9)
  61. * @param String sInputs (必需) 入参字符串
  62. * @return boolean true/false:是整数则返回true,否则返回false
  63. * <pre>
  64. * 使用举例:
  65. * var _bSf = CFW.oValid.fnIsInteger(_sInputs);
  66. * </pre>
  67. */
  68. fnIsInteger : function (sInputs) {
  69. var strlength,rslength;
  70. //入参为必需项,需要先进行非空校验。
  71. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsInteger 入参字符串")){
  72. return false;
  73. };
  74. sInputs = sInputs + "";
  75. var regx=/-?[0-9]+/; //正则表达式 ‘-’出现0次或一次 [0-9]出现一次或多次
  76. var rs=regx.exec(sInputs);
  77. if(this.fnIsNull(rs)) return false;
  78. strlength = (sInputs + '').length;
  79. rslength = (rs + '').length ;
  80. if(strlength == rslength) {
  81. return true ;
  82. }
  83. return false;
  84. },
  85. /**
  86. * 判断输入是否为数值(包括小数点)
  87. * 主要是判断传入的字符串,是否为数值(包括小数点)
  88. * @param String sInputs (必需) 入参字符串
  89. * @returns boolean true/false:是数值则返回true,否则返回false
  90. * <pre>
  91. * 使用举例:
  92. * var _bSf = CFW.oValid.fnIsFloat(_sInputs);
  93. * </pre>
  94. */
  95. fnIsFloat : function (sInputs) {
  96. var tmp;
  97. var strlength,rslength ;
  98. tmp = sInputs;
  99. if(this.fnIsNull(tmp,"CFW.oValid.fnIsFloat 入参字符串")) return false;
  100. if(this.fnIsInteger(tmp)) return true;
  101. var regx = /-?[0-9]+\.?[0-9]+/; //正则表达式 ‘-’出现0次或一次 [0-9]出现一次或多次 小数点出现0次或1次 [0-9]出现一次或多次
  102. var rs = regx.exec(tmp);
  103. if(this.fnIsNull(rs)) return false;
  104. strlength = (tmp + '').length;
  105. rslength = (rs + '').length ;
  106. //CFW.oWin.fnAlert(strlength + '||' + rslength) ;
  107. if(strlength == rslength) {
  108. return true ;
  109. }else {
  110. regx = /-?[0-9]*\.?[0-9]+/; //正则表达式 ‘-’出现0次或一次 [0-9]出现0次或多次 小数点出现0次或1次 [0-9]出现一次或多次
  111. rs = regx.exec(tmp);
  112. if(this.fnIsNull(rs)) return false;
  113. rslength = (rs + '').length ;
  114. if(strlength == rslength) {
  115. return true ;
  116. }
  117. }
  118. return false;
  119. },
  120. /**
  121. * 判断输入是否为电话号码,可以包含数字0至9,符号+、-、/、(、)以及空格
  122. * 主要是判断传入的字符串,是否为电话号码
  123. * @param String sInputs (必需)入参字符串
  124. * @returns boolean true/false:是电话号码则返回true,否则返回false
  125. * <pre>
  126. * 使用举例:
  127. * var _bSfdhhm = CFW.oValid.fnIsPhoneNumber(_sInputs);
  128. * </pre>
  129. */
  130. fnIsPhoneNumber : function (sInputs) {
  131. var i,tempchar;
  132. //入参为必需项,需要先进行非空校验。
  133. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsPhoneNumber 入参字符串")){
  134. return false;
  135. };
  136. sInputs = CFW.oStr.fnNub2Str(sInputs);
  137. if(sInputs == "")
  138. return false;
  139. strlength = sInputs.length;
  140. for(i = 0 ; i < strlength ; i++) {
  141. tempchar = sInputs.substring(i,i+1);
  142. if(!(tempchar==0||tempchar==1||tempchar==2||tempchar==3||tempchar==4||tempchar==5||tempchar==6||tempchar==7||tempchar==8||tempchar==9||tempchar=='-'||tempchar=='+'||tempchar==' '||tempchar=='/'||tempchar=='('||tempchar==')'))
  143. {
  144. return(false);
  145. }
  146. }
  147. return(true);
  148. },
  149. /**
  150. * 判断输入是否为Email
  151. * @param String sInputs (必需) 入参字符串
  152. * @returns boolean true/false:是Email则返回true,否则返回false
  153. * <pre>
  154. * 使用举例:
  155. * var _bSf = CFW.oValid.fnIsEmail(_sInputs);
  156. * </pre>
  157. */
  158. fnIsEmail : function (sInputs) {
  159. var bflag = true;
  160. //入参为必需项,需要先进行非空校验。
  161. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsEmail 入参字符串")){
  162. return false;
  163. };
  164. var re = /^(\w-*\.*)+@(\w-?)+(\.\w{2,})+$/;
  165. if(!re.test(sInputs)){
  166. return false;
  167. }
  168. return bflag;
  169. },
  170. /**
  171. * 判断输入是否含有中文
  172. * @param String sInputs (必需) 入参字符串
  173. * @returns boolean true/false:含有中文则返回true,否则返回false
  174. * <pre>
  175. * 使用举例:
  176. * var _bSf = CFW.oValid.fnHasChinese(_sParam);
  177. * </pre>
  178. */
  179. fnHasChinese : function (sInputs) {
  180. var sInputs = sInputs || "";
  181. if(escape(sInputs).indexOf("%u") != -1) {
  182. return true;
  183. }
  184. return false;
  185. },
  186. /**
  187. * 判断输入是否全为中文 ,如果有空格则返回false并提示
  188. * @param String sInputs (必需) 入参字符串
  189. * @returns boolean true/false:全为中文则返回true,否则返回false
  190. * <pre>
  191. * 使用举例:
  192. * var _bSf = CFW.oValid.fnIsAllChinese(_sParam);
  193. * </pre>
  194. */
  195. fnIsAllChinese : function (sInputs) {
  196. //入参为必需项,需要先进行非空校验。
  197. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsAllChinese 入参字符串")){
  198. return false;
  199. };
  200. if(/[^\u4E00-\u9FA5]/gi.test(sInputs)) {
  201. return false;
  202. }
  203. return true;
  204. },
  205. /**
  206. * 判断输入是否含有空格,如果有空格则返回false并提示
  207. * @param String sInputs (必需) 入参字符串
  208. * @returns boolean true/false:含有空格则返回false,否则返回true
  209. * <pre>
  210. * 使用举例:
  211. * var _bSf = CFW.oValid.fnHasBlank(_sParam);
  212. * </pre>
  213. */
  214. fnHasBlank : function (sInputs) {
  215. var strlength;
  216. var k;
  217. var ch;
  218. //入参为必需项,需要先进行非空校验。
  219. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsAllChinese fnHasBlank")){
  220. return false;
  221. };
  222. strlength = sInputs.length;
  223. for(k = 0 ; k <= strlength ; k++) {
  224. ch = sInputs.substring(k,k+1);
  225. if(ch == " ") {
  226. CFW.oWin.fnAlert("对不起 不能输入空格 ");
  227. return false;
  228. }
  229. }
  230. return true;
  231. },
  232. /**
  233. * 判断输入是否为年月(格式:YYYYMM)
  234. * @param String sInputs (必需) 入参字符串
  235. * @returns boolean true/false:是年月则返回true,否则返回false
  236. * <pre>
  237. * 使用举例:
  238. * var _bSf = CFW.oValid.fnIsNY(_sParam);
  239. * </pre>
  240. */
  241. fnIsNY : function (sInputs) {
  242. //入参为必需项,需要先进行非空校验。
  243. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsNY 入参字符串")){
  244. return false;
  245. };
  246. //入参长度校验
  247. if(!this.fnIsLen(sInputs,6)){
  248. return false;
  249. };
  250. var yy = sInputs.substring(0,4);
  251. var mm = sInputs.substring(4,6);
  252. if(!this.fnIsInteger(yy)) return false;
  253. if(!this.fnIsInteger(mm)) return false;
  254. if(yy < "1900" || yy > "2999") return false;
  255. if(mm < "01" || mm > "12") return false;
  256. return true;
  257. },
  258. /**
  259. * 判断输入是否为日期
  260. * @param String sInputs (必需) 日期字符串,格式包括:yyyyMM,yyyy-MM,yyyymmdd,yyyy-mm-dd, yyy-MM-dd hh:mi:ss 且为合法的日期,
  261. * 以及去掉入参中-,/,空格后,为yyyyMMddhhmiss这种样式中的从左到右的6、7、8、10、19、14中的一种
  262. * @param String sFormat 日期格式字符串:可按指定格式校验传入的日期字符串 是否符合指定的格式,格式范围见上文。如果为空,则只要符合以上任意格式即可。
  263. * @returns boolean true/false:是日期则返回true,否则返回false
  264. * <pre>
  265. * 使用举例:
  266. * var _bSf = CFW.oValid.fnIsDate(_sParam);
  267. * </pre>
  268. */
  269. fnIsDate : function (sInputs,sFormat) {
  270. //入参为必需项,需要先进行非空校验。
  271. if(this.fnIsNull(sInputs,"CFW.oValid.fnIsDate 日期字符串")){
  272. return false;
  273. };
  274. var tempStrArr =sInputs.split(" ");
  275. var tempStr ;
  276. tempStr = sInputs.replace(/-/g,''); //去除入参 sInputs中的 -
  277. tempStr = tempStr.replace(/\//g,'');//去除入参 sInputs中的 /
  278. tempStr = tempStr.replace(/:/g,'');//去除入参 sInputs中的 :
  279. tempStr = tempStr.replace(/ /g,'');//去除入参 sInputs中的 空格
  280. var length = tempStr.length;//去除以上字符后,计算入参长度,根据长度调用不同的方法,进行相应判断
  281. if(this.fnIsNull(sFormat)){//日期格式为空时,
  282. if(length == 0) {
  283. return false ;
  284. } else if(length == 6) {//去除以上字符后,yyyyMM 格式
  285. if (this._fnIsDateShort(sInputs)||this.fnIsNY(sInputs)){
  286. return true;
  287. }
  288. } else if(length == 8) {//去除以上字符后,yyyymmdd 格式
  289. return this._fnIsDate(sInputs) ;
  290. } else if(length == 14) {//去除以上字符后,yyyymmddhhmiss 格式
  291. //yyy-MM-dd hh:mi:ss
  292. if(this._fnIsDate(tempStrArr[0])){
  293. if(this._fnIsDate2(tempStrArr[0])){
  294. if(this.fnIsTime(tempStrArr[1])){
  295. return true;
  296. }
  297. }
  298. }
  299. //yyyymmddhhmiss
  300. if(sInputs.length= 14 && this._fnIsDate(sInputs.substr(0,8))){
  301. if(this.fnIsTime(sInputs.substr(8,2) + ":" + sInputs.substr(10,2) + ":" + sInputs.substr(12,2))){
  302. return true;
  303. }
  304. }
  305. }
  306. }else{//如果日期格式字符串 不为空,则按指定的格式校验
  307. var _sFormat = sFormat.toLowerCase();
  308. if(_sFormat=="yyyy-mm-dd"){
  309. return this._fnIsDate2(sInputs) ;
  310. }else if( _sFormat=="yyyy/mm/dd" || _sFormat=="yyyymmdd"){
  311. return this._fnIsDate(sInputs) ;
  312. }else if( _sFormat=="yyyy-mm" ){
  313. return this._fnIsDateShort(sInputs) ;
  314. }else if( _sFormat=="yyyymm" ){
  315. return this.fnIsNY(sInputs) ;
  316. }else if( _sFormat=="yyyy-mm-dd hh:mi:ss"){//去除以上字符后,yyyymmddhhmiss 格式
  317. if(this._fnIsDate(tempStrArr[0])){
  318. if(this._fnIsDate2(tempStrArr[0])){
  319. if(this.fnIsTime(tempStrArr[1])){
  320. return true;
  321. }
  322. }
  323. }
  324. }else if(_sFormat=="yyyymmddhhmiss"){//去除以上字符后,yyyymmddhhmiss 格式
  325. if(this._fnIsDate(sInputs.substr(0,8))){
  326. if(this.fnIsTime(sInputs.substr(8,2) + ":" + sInputs.substr(10,2) + ":" + sInputs.substr(12,2))){
  327. return true;
  328. }
  329. }
  330. }else{
  331. CFW.oWin.fnAlert("日期格式"+_sFormat+"错误");
  332. return false;
  333. }
  334. }
  335. return false;
  336. },
  337. /**
  338. * 判断输入是否为时间
  339. * @param String sInputTime (必需) 入参字符串 格式:hh:mm:ss,且为合法的24小时制时间
  340. * @returns boolean true/false:是时间则返回true,否则返回false
  341. * <pre>
  342. * 使用举例:
  343. * var _bSf = CFW.oValid.fnIsTime(_sInputs);
  344. * </pre>
  345. */
  346. fnIsTime : function (sInputTime) {
  347. var hStr;
  348. var mStr;
  349. var sStr;
  350. var h;
  351. var m;
  352. var s;
  353. //入参为必需项,需要先进行非空校验。
  354. if(this.fnIsNull(sInputTime,"CFW.oValid.fnIsTime 入参字符串")){
  355. return false;
  356. };
  357. //入参长度校验
  358. if(!this.fnIsLen(sInputTime,8)){
  359. return false;
  360. };
  361. if(sInputTime.length == 8)
  362. {
  363. if((sInputTime.substring(2,3) == ":") && (sInputTime.substring(5,6) == ":"))
  364. {
  365. hStr = sInputTime.substring(0,2);
  366. mStr = sInputTime.substring(3,5);
  367. sStr = sInputTime.substring(6,8);
  368. if(!this.fnIsInteger(hStr)) return false ;
  369. if(!this.fnIsInteger(mStr)) return false ;
  370. if(!this.fnIsInteger(sStr)) return false ;
  371. h = parseInt(hStr);
  372. m = parseInt(mStr);
  373. s = parseInt(sStr);
  374. if((h <= 23) && (m <= 59) && (s <= 59))
  375. return true;
  376. else
  377. return false;
  378. }
  379. return true;
  380. }
  381. else
  382. {
  383. return false;
  384. }
  385. },
  386. /**
  387. * 判断输入是否为日期+时间 格式:yyyy-MM-dd hh:mm:ss,且为合法的日期和合法的24小时制时间
  388. * @param String sInputs (必需) 入参字符串 格式:yyyy-MM-dd hh:mm:ss,且为合法的24小时制时间
  389. * @returns boolean true/false:是日期+时间则返回true,否则返回false
  390. * <pre>
  391. * 使用举例:
  392. * var _bSf = CFW.oValid.fnIsDateTime(_sInputs);
  393. * </pre>
  394. */
  395. fnIsDateTime : function (sInputs) {
  396. //入参为必需项,需要先进行非空校验。
  397. if(this.fnIsNull(sInputs, "CFW.oValid.fnIsDateTime 入参字符串")){
  398. return false;
  399. };
  400. //入参长度校验
  401. if(!this.fnIsLen(sInputs,19)){
  402. return false;
  403. };
  404. var str1 = sInputs.split(" ");
  405. if(this._fnIsDate(str1[0])){
  406. if(this._fnIsDate2(str1[0])){
  407. if(this.fnIsTime(str1[1])){
  408. return true;
  409. }
  410. }
  411. }
  412. return false;
  413. },
  414. /**
  415. * 判断输入是否为空,
  416. * 如果sMsg不为空时,在检查sInputs非空失败时提示sMsg+" 不能为空!",并返回true
  417. * @param String sInputs (必需) 入参字符串
  418. * @param String sMsg 提示信息 格式:"api名称.参数名称"
  419. * @returns boolean true/false:为空则返回true,否则返回false
  420. * <pre>
  421. * 使用举例:
  422. * var _bSf = CFW.oValid.fnIsNull(_sInputs);
  423. * 或
  424. * var _bSf = CFW.oValid.fnIsNull(_sInputs,sMsg);
  425. * </pre>
  426. */
  427. fnIsNull : function (sInputs,sMsg) {
  428. if(sInputs == null){
  429. if (sMsg != undefined && sMsg != null && sMsg != '' ) {
  430. var sError = sMsg +" 不能为空!";
  431. CFW.oWin.fnAlert(sError);
  432. }
  433. return true;
  434. }
  435. if (typeof sInputs == "object" ) {
  436. return false;
  437. }
  438. var temp;
  439. temp = CFW.oStr.fnNub2Str(sInputs);
  440. try{
  441. temp = $.trim(temp);
  442. }catch(e){}
  443. if(typeof(sInputs) == "undefined" || sInputs == null || (temp == "") || (temp.length == 0))
  444. {
  445. if (sMsg != undefined && sMsg != null && sMsg != '' ) {
  446. var sError = sMsg +" 不能为空!";
  447. CFW.oWin.fnAlert(sError);
  448. return true;
  449. //throw new Error(sError);
  450. }
  451. return true;
  452. }
  453. return false;
  454. },
  455. /**
  456. * 判断输入是否为数值(包括小数点)
  457. * @param String sInputs (必需) 入参字符串
  458. * @param int iLength (必需) 表示要判断的小数位数,如4,表示小数点后不能超过4位
  459. * @returns boolean true/false:是数值则返回true,否则返回false
  460. * <pre>
  461. * 使用举例:
  462. * var _bSf = CFW.oValid.fnCheckFloat(_sInputs);
  463. * </pre>
  464. */
  465. fnCheckFloat : function (sInputs,iLength) {
  466. var tmp;
  467. var temp;
  468. var num;
  469. tmp = sInputs;
  470. if(this.fnIsNull(tmp,"CFW.oValid.fnCheckFloat 入参字符串")) return false;
  471. if(this.fnIsNull(iLength,"CFW.oValid.fnCheckFloat 小数位数") || !this.fnIsInteger(iLength)) {
  472. return false;
  473. }
  474. if(!this.fnIsFloat(tmp)) return false;
  475. num = tmp.indexOf('.') ;
  476. if(num<0){
  477. return true;
  478. }
  479. temp = tmp.substr(num + 1) ;
  480. if((temp + '').length <= iLength) {
  481. return true ;
  482. }
  483. return false ;
  484. },
  485. /**
  486. * 判断输入值长度是否符合要求,
  487. * 如果sMsg不为空时,在检查sInputs非空失败时提示sMsg +" 长度不等于"+nLen并返回false;
  488. * @param String sInputs (必需) 入参字符串
  489. * @param String iLen (必需) 长度
  490. * @param String sMsg 提示信息
  491. * @param boolean bZW 是否为中文(默认为否),如果选“是”则判断字符的字节长度,选“否”则取字符长度。
  492. * @returns boolean true/false:长度符合要求则返回true,否则返回false
  493. * <pre>
  494. * 使用举例:
  495. * var _bSf = CFW.oValid.fnIsLen(_sInputs,_iLen,_sMsg,_bZW);
  496. * </pre>
  497. */
  498. fnIsLen : function (sInputs,iLen,sMsg,bZW){
  499. var ilenInputs;
  500. ilenInputs = sInputs.length;//默认取字符长度
  501. if (bZW){//如果是中文,则取sInputs的bit长度
  502. ilenInputs = CFW.oStr.fnLengthB(sInputs);
  503. }
  504. if (ilenInputs != iLen){
  505. if(!this.fnIsNull(sMsg)){
  506. var sError = sMsg +" 长度不等于"+iLen;
  507. CFW.oWin.fnAlert(sError);
  508. throw new Error(sError);
  509. }
  510. return false;
  511. }
  512. return true;
  513. },
  514. /**
  515. * (私有方法)判断输入是否为日期,录入的格式可以为yyyy-mm-dd,yyyymmdd,yyyy/mm/dd
  516. * @param String sInputs (必需) 入参字符串
  517. * @returns boolean true/false:是日期则返回true,否则返回false
  518. * <pre>
  519. * 使用举例:(该组件内容调用)
  520. * _fnIsDate(_sInputs);
  521. * </pre>
  522. */
  523. _fnIsDate : function (_sInputs){
  524. var sYear ='';
  525. var sMonth='';
  526. var sDay ='';
  527. var arry;
  528. var j =0;
  529. var i =0;
  530. var s="-";
  531. i = _sInputs.indexOf(s);
  532. if(i==-1){s="/";}
  533. i = _sInputs.indexOf(s);
  534. if(i==-1){s="";}
  535. if(i>-1){
  536. j = _sInputs.lastIndexOf(s);
  537. }
  538. //yyyy-mm-dd 或 yyyy/mm/dd
  539. if(i>0 && _sInputs.length != 10){
  540. return false;
  541. }
  542. if(i>0){
  543. if((i != 4)||(j != 7)) return false;
  544. arry = _sInputs.split(s);
  545. sYear =arry[0];
  546. sMonth =arry[1];
  547. sDay =arry[2];
  548. }
  549. if(i==-1 && _sInputs.length != 8){
  550. return false;
  551. }
  552. //yyyymmdd
  553. if(i==-1 && _sInputs.length == 8){
  554. sYear =_sInputs.substr(0,4);
  555. sMonth =_sInputs.substr(4,2);
  556. sDay =_sInputs.substr(6);
  557. }
  558. if(sDay==""){return false;}
  559. if(sDay!="" && !this._fnFWIsDate(sYear,sMonth,sDay)){
  560. return false;
  561. }else{
  562. return true;
  563. }
  564. },
  565. /**
  566. * (私有方法)判断输入是否为日期 格式:yyyy-MM-dd,且为合法的日期
  567. * @param String sInputs (必需)
  568. * @returns boolean true/false:为空则返回true,否则返回false
  569. * <pre>
  570. * 使用举例:(该组件内容调用)
  571. * _fnIsDate2(_sInputs);
  572. * </pre>
  573. */
  574. _fnIsDate2 : function (_sInputs){
  575. _sInputs = _sInputs.replace(/(^\s+)?(\s+$)?/gi, "");
  576. var strSeparator = "-";
  577. var strDateArray;
  578. var intYear;
  579. var intMonth;
  580. var intDay;
  581. var boolLeapYear;
  582. var ln_len=_sInputs.length;
  583. if(ln_len<8||ln_len>10) return false;//长度判断
  584. strDateArray = _sInputs.split(strSeparator);
  585. if(strDateArray.length!=3) return false;
  586. intYear = parseInt(strDateArray[0],10);
  587. intMonth = parseInt(strDateArray[1],10);
  588. intDay = parseInt(strDateArray[2],10);
  589. if(isNaN(intYear)||isNaN(intMonth)||isNaN(intDay)) return false;
  590. if(intYear<1900||intYear>2999) return false;
  591. if(intMonth>12||intMonth<1) return false;
  592. if((intMonth==1||intMonth==3||intMonth==5||intMonth==7||intMonth==8||intMonth==10||intMonth==12)&&(intDay>31||intDay<1)) return false;
  593. if((intMonth==4||intMonth==6||intMonth==9||intMonth==11)&&(intDay>30||intDay<1)) return false;
  594. if(intMonth==2){
  595. if(intDay<1) return false;
  596. boolLeapYear = false;
  597. if((intYear%100)==0){
  598. if((intYear%400)==0) boolLeapYear = true;
  599. }
  600. else{
  601. if((intYear%4)==0) boolLeapYear = true;
  602. }
  603. if(boolLeapYear){
  604. if(intDay>29) return false;
  605. }
  606. else{
  607. if(intDay>28) return false;
  608. }
  609. }
  610. return true;
  611. },
  612. /**
  613. * (私有方法)判断输入是否为日期 格式:yyyy-MM,且为合法的日期
  614. * @param String sInputs (必需)
  615. * @returns boolean true/false:为空则返回true,否则返回false
  616. * <pre>
  617. * 使用举例:(该组件内容调用)
  618. * _fnIsDateShort(_sInputs);
  619. * </pre>
  620. */
  621. _fnIsDateShort : function (_sInputs){
  622. var strSeparator = "-";
  623. var strDateArray;
  624. var intYear;
  625. var intMonth;
  626. var ln_len=_sInputs.length;
  627. if(ln_len<6||ln_len>7) return false;//长度判断
  628. strDateArray = _sInputs.split(strSeparator);
  629. if(strDateArray.length!=2) return false;
  630. intYear = parseInt(strDateArray[0],10);
  631. intMonth = parseInt(strDateArray[1],10);
  632. if(isNaN(intYear)||isNaN(intMonth)) return false;
  633. if(intYear<1900||intYear>2999) return false;
  634. if(intMonth>12||intMonth<1) return false;
  635. return true;
  636. },
  637. /**
  638. * (私有方法)判断输入是否为正常的日期
  639. * @param String sYear (必需)
  640. * String sMonth (必需)
  641. * String sDay (必需)
  642. * @returns boolean true/false:为空则返回true,否则返回false
  643. * <pre>
  644. * 使用举例:(该组件内容调用)
  645. * _fnIsDateShort(_sInputs);
  646. * </pre>
  647. */
  648. _fnFWIsDate : function (sYear,sMonth,sDay) {
  649. var iYear=0;
  650. var iMonth=0;
  651. var iDay=0;
  652. iYear = parseInt(sYear,10);
  653. iMonth = parseInt(sMonth,10);
  654. iDay = parseInt(sDay,10);
  655. var date = new Date(iYear, iMonth - 1, iDay);
  656. if (date.getFullYear() != iYear || date.getMonth() + 1 != iMonth || date.getDate() != iDay) return false; // E.g. 31/02/*
  657. return true;
  658. },
  659. /**
  660. * 身份证校验提示信息,供框架内部的身份证校验函数使用
  661. */
  662. _IDCARD_MSG : "",
  663. /**
  664. * (私有方法)只能录入身份证号码。
  665. * 如果控件的值不合法,则给予提示;如果控件的值是15位,则升为18位
  666. * @param obj 控件dom对象
  667. * @returns
  668. * <pre>
  669. * 使用举例:(该组件内容调用)
  670. * CFW.oValid._fnFWidcard(obj);
  671. * </pre>
  672. */
  673. _fnFWidcard : function(obj){
  674. var str = obj.value;
  675. if(str==''){return;}
  676. if(_CHECK_IDCARD){
  677. var flag=this._fnFWidcardCheck(str);
  678. if(!flag){
  679. CFW.oTip.fnValidateTip(obj,this._IDCARD_MSG);
  680. }else{
  681. if(str.length==15){
  682. obj.value = this._IDCARD_TRANS;
  683. }
  684. }
  685. }else{
  686. if(!this._fnFWidcardCheck(str)){
  687. CFW.oTip.fnValidateTip(obj,this._IDCARD_MSG);
  688. }else{
  689. if(str.length==15){
  690. obj.value = this._fnFWidcar15to18(str);
  691. }
  692. }
  693. }
  694. },
  695. /**
  696. * (私有方法)只能录入只能录入中文,如果不是中文则给予提示
  697. * @param obj dom对象
  698. * @returns boolean true/false:如果是中文返回true,否则返回false
  699. * <pre>
  700. * 使用举例:(该组件内容调用)
  701. * CFW.oValid._fnFWchiness(obj);
  702. * </pre>
  703. */
  704. _fnFWchiness : function(obj){
  705. var str = obj.value;
  706. var sWord ="";
  707. var strn ="";
  708. var iLen = str.length;
  709. if(str==''){return;}
  710. if(/[^\u4E00-\u9FA5]/gi.test(str)){
  711. CFW.oTip.fnValidateTip(obj,'此输入框只能录入中文!');
  712. return false;
  713. }
  714. for(i=0;i<iLen;i++){
  715. sWord = str.substr(i,1);
  716. if(!(/[^\u4E00-\u9FA5]/gi.test(sWord))){
  717. strn=strn+''+sWord;
  718. }
  719. }
  720. obj.value = strn;
  721. return true;
  722. },
  723. _fnIschiness : function(str){
  724. var sWord ="";
  725. var strn ="";
  726. var iLen = str.length;
  727. if(str==''){return;}
  728. if(/[^\u4E00-\u9FA5]/gi.test(str)){
  729. return '不是中文!';
  730. }
  731. for(i=0;i<iLen;i++){
  732. sWord = str.substr(i,1);
  733. if(!(/[^\u4E00-\u9FA5]/gi.test(sWord))){
  734. strn=strn+''+sWord;
  735. }
  736. }
  737. var value = strn;
  738. return true;
  739. },
  740. /**
  741. * (私有方法)只能录入只能录入数值,如果不是数值则给予提示
  742. * @param obj dom对象
  743. * @returns boolean true/false:如果是数字返回true,否则返回false
  744. * <pre>
  745. * 使用举例:(该组件内容调用)
  746. * CFW.oValid._fnFWnumber(obj);
  747. * </pre>
  748. */
  749. _fnFWnumber: function(obj){
  750. var str;
  751. var iValue=0;
  752. var sWord='';
  753. var reg;
  754. str = obj.value;
  755. if(str==''||str== null){return;}
  756. sWord = str.substr(0,1);
  757. if(sWord!='-'){
  758. reg= /^(([1-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
  759. }
  760. else{
  761. //负浮点数
  762. reg= /^(-(([1-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  763. }
  764. if(!reg.test(str)){
  765. CFW.oTip.fnValidateTip(obj,'此输入框只能录入数值!');
  766. return false;
  767. }
  768. obj.value =parseFloat(str,10);
  769. return true;
  770. },
  771. /**
  772. * (私有方法)只能录入只能录入数值,如果不是数值则给予提示
  773. * @param obj dom对象
  774. * @returns boolean true/false:如果是数字返回true,否则返回false
  775. * <pre>
  776. * 使用举例:(该组件内容调用)
  777. * CFW.oValid._fnFWnumber(obj);
  778. * </pre>
  779. */
  780. _fnIsNumber: function(str){
  781. if(str==''||str== null){return;}
  782. sWord = str.substr(0,1);
  783. if(sWord!='-'){
  784. reg= /^(([1-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/;
  785. }
  786. else{
  787. //负浮点数
  788. reg= /^(-(([1-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  789. }
  790. if(!reg.test(str)){
  791. return '不是数字!';
  792. }
  793. var value=parseFloat(str,10);
  794. return true;
  795. },
  796. /**
  797. * (私有方法)只能录入只能录入年月,如果不是年月则给予提示
  798. * @param obj dom对象
  799. * @returns boolean true/false:如果是年月返回true,否则返回false
  800. * <pre>
  801. * 使用举例:(该组件内容调用)
  802. * CFW.oValid._fnFWyearmonth(obj);
  803. * </pre>
  804. */
  805. _fnFWyearmonth :function(obj){
  806. var reg;
  807. var str = obj.value;
  808. if(str==''){return true;}
  809. if(str.length != 6){
  810. CFW.oTip.fnValidateTip(obj,'此输入框只能录入年月!');
  811. obj.value='';
  812. return false;
  813. }
  814. reg= /^([1-9][0-9]{3}[0-1][0-9])$/;
  815. if(!reg.test(str)){
  816. CFW.oTip.fnValidateTip(obj,'此输入框只能录入年月!');
  817. obj.value='';
  818. return false;
  819. }
  820. var mm=str.substring(4,6);
  821. if(mm<"01"||mm>"12"){
  822. CFW.oTip.fnValidateTip(obj,'此输入框只能录入年月!');
  823. obj.value='';
  824. return false;
  825. }
  826. return true;
  827. },
  828. /**
  829. * (私有方法)只能录入只能录入日期,如果不是日期则给予提示
  830. * @param obj dom对象
  831. * @param sFormat 日期格式,例如yyyy-mm-dd,dd/mm/yyyy等。
  832. * @returns boolean true/false:如果是日期返回true,否则返回false
  833. * <pre>
  834. * 使用举例:(该组件内容调用)
  835. * CFW.oValid._fnFWdatebox(obj,sFormat);
  836. * </pre>
  837. */
  838. _fnFWdatebox: function(obj,sFormat){
  839. var reg;
  840. var arry;
  841. var sYear,sMonth,sDay;
  842. var str = obj.value;
  843. if(str==''){return true;}
  844. if(sFormat==''){sFormat='yyyy-mm-dd';}
  845. if(sFormat=='yyyy-mm-dd'||sFormat=='YYYY-MM-DD'){
  846. arry = str.split('-');
  847. if(arry.length==3){
  848. sYear =arry[0];
  849. sMonth =arry[1];
  850. sDay =arry[2];
  851. if(sDay.length==1){sDay='0'+sDay;}
  852. if(sMonth.length==1){sMonth='0'+sMonth;}
  853. str=sYear+'-'+sMonth+'-'+sDay;
  854. }
  855. }
  856. if(sFormat=='yyyy/mm/dd'||sFormat=='YYYY/MM/DD'){
  857. arry = str.split('/');
  858. if(arry.length==3){
  859. sYear =arry[0];
  860. sMonth =arry[1];
  861. sDay =arry[2];
  862. if(sDay.length==1){sDay='0'+sDay;}
  863. if(sMonth.length==1){sMonth='0'+sMonth;}
  864. str=sYear+'/'+sMonth+'/'+sDay;
  865. }
  866. }
  867. if(sFormat=='dd-mm-yyyy'||sFormat=='DD-MM-YYYY'){
  868. arry = str.split('-');
  869. if(arry.length==3){
  870. sYear =arry[2];
  871. sMonth =arry[1];
  872. sDay =arry[0];
  873. if(sDay.length==1){sDay='0'+sDay;}
  874. if(sMonth.length==1){sMonth='0'+sMonth;}
  875. str=sDay+'-'+sMonth+'-'+sYear;
  876. }
  877. }
  878. if(sFormat=='dd/mm/yyyy'||sFormat=='DD/MM/YYYY'){
  879. arry = str.split('/');
  880. if(arry.length==3){
  881. sYear =arry[2];
  882. sMonth =arry[1];
  883. sDay =arry[0];
  884. if(sDay.length==1){sDay='0'+sDay;}
  885. if(sMonth.length==1){sMonth='0'+sMonth;}
  886. str=sDay+'/'+sMonth+'/'+sYear;
  887. }
  888. }
  889. if(!this._fnFWdateFormat(str,sFormat)){
  890. CFW.oTip.fnValidateTip(obj,'输入的日期不正确 格式为 ' + sFormat);
  891. obj.value='';
  892. return false;
  893. }else{
  894. obj.value = str;
  895. }
  896. return true;
  897. },
  898. /**
  899. * (私有方法)只能录入只能录入日期时间,如果不是日期时间则给予提示
  900. * @param obj dom对象
  901. * @returns boolean true/false:如果是日期时间返回true,否则返回false
  902. * <pre>
  903. * 使用举例:(该组件内容调用)
  904. * CFW.oValid._fnFWdatetime(obj);
  905. * </pre>
  906. */
  907. _fnFWdatetime: function(obj){
  908. var sFormat='yyyy-mm-dd';
  909. var arry;
  910. var str = obj.value;
  911. var sDate ="";
  912. var sTime ="";
  913. if(str==''){return true;}
  914. arry =str.split(' ');
  915. if(arry.length!=2){
  916. CFW.oTip.fnValidateTip(obj,'输入的时间不正确 格式为 yyyy-mm-dd hh:mm:ss');
  917. obj.value='';
  918. return false;
  919. }
  920. sDate = arry[0];
  921. sTime = arry[1];
  922. if(!this._fnFWdateFormat(sDate,sFormat)){
  923. CFW.oTip.fnValidateTip(obj,'录入的时间不正确 格式为 yyyy-mm-dd hh:mm:ss');
  924. obj.value='';
  925. return false;
  926. }
  927. if(!this._fnFWtimeFormat(sTime)){
  928. CFW.oTip.fnValidateTip(obj,'时间不正确 格式为 yyyy-mm-dd hh:mm:ss');
  929. obj.value='';
  930. return false;
  931. }
  932. return true;
  933. },
  934. /**
  935. * (私有方法)只能录入只能录入时间,如果不是时间则给予提示
  936. * @param obj dom对象
  937. * @returns boolean true/false:如果是时间返回true,否则返回false
  938. * <pre>
  939. * 使用举例:(该组件内容调用)
  940. * CFW.oValid._fnFWtimebox(obj);
  941. * </pre>
  942. */
  943. _fnFWtimebox : function(obj){
  944. var arry;
  945. var reg;
  946. var bTF=false;
  947. var sHour ="";
  948. var sMinute ="";
  949. var str = obj.value;
  950. if(str==''){return;}
  951. if(str.length<5||str.length>8){
  952. bTF = false;
  953. }
  954. if(str.length==5){
  955. str=str+":00";
  956. }
  957. if(bTF){
  958. reg= /^([0-2][0-9][:][0-6][0-9][:][0-6][0-9])$/;
  959. bTF = reg.test(str);
  960. }
  961. bTF = this._fnFWtimeFormat(str);
  962. if(!bTF){
  963. CFW.oTip.fnValidateTip(obj,'时间不正确 格式为 hh:mm:ss');
  964. obj.value='';
  965. return false;
  966. }
  967. obj.value= str;
  968. return true;
  969. },
  970. /**
  971. * 校验时间格式是否正确
  972. * @param obj dom对象
  973. * @returns boolean true/false:如果是合法时间返回true,否则返回false
  974. * <pre>
  975. * 使用举例:(该组件内容调用)
  976. * CFW.oValid._fnFWtimeFormat(str);
  977. * </pre>
  978. */
  979. _fnFWtimeFormat : function(str){
  980. var reg;
  981. var arry;
  982. var sHour;
  983. var sMinute;
  984. var sSecond;
  985. var iHour=0;
  986. var iMinute=0;
  987. var iSecond=0;
  988. reg= /^([0-2][0-9][:][0-6][0-9][:][0-6][0-9])$/;
  989. if(!reg.test(str)){
  990. return false;
  991. }
  992. arry = str.split(":");
  993. sHour = arry[0];
  994. sMinute = arry[1];
  995. sSecond = arry[2];
  996. iHour = parseInt(sHour,10);
  997. iMinute = parseInt(sMinute,10);
  998. iSecond = parseInt(sSecond,10);
  999. if(iHour<0||iHour>24){return false;}
  1000. if(iMinute<0||iMinute>60){return false;}
  1001. if(iSecond<0||iSecond>60){return false;}
  1002. return true;
  1003. },
  1004. /**
  1005. * 校验日期格式是否正确
  1006. * @param str 字符串,日期
  1007. * 支持的校验日期的格式
  1008. * yyyy-mm-dd、yyyy/mm/dd、yyyymmdd、
  1009. * dd-mm-yyyy、 dd/mm/yyyy、ddmmyyyy
  1010. * @returns boolean true/false:如果是合法日期返回true,否则返回false
  1011. * <pre>
  1012. * 使用举例:(该组件内容调用)
  1013. * CFW.oValid._fnFWdateFormat(str);
  1014. * </pre>
  1015. */
  1016. _fnFWdateFormat: function(str,sFormat){
  1017. var reg;
  1018. var arry;
  1019. var sYear,sMonth,sDay;
  1020. //默认的格式
  1021. if(sFormat=='yyyy-mm-dd'||sFormat=='YYYY-MM-DD'||sFormat==''){
  1022. arry = str.split('-');
  1023. if(arry.length==3){
  1024. sYear =arry[0];
  1025. sMonth =arry[1];
  1026. sDay =arry[2];
  1027. str=sYear+'-'+sMonth+'-'+sDay;
  1028. }
  1029. reg= /^([1-9][0-9]{3}[-][0-1][0-9][-][0-3][0-9])$/;
  1030. if(sFormat==''){sFormat='yyyy-mm-dd';}
  1031. }
  1032. //yyyymmdd
  1033. if(sFormat=='yyyymmdd'||sFormat=='YYYYMMDD'){
  1034. if(str.length==8){
  1035. sYear =str.substr(0,4);
  1036. sMonth =str.substr(4,2);
  1037. sDay =str.substr(6,2);
  1038. }
  1039. reg= /^([1-9][0-9]{3}[0-1][0-9][0-3][0-9])$/;
  1040. }
  1041. // dd-mm-yyyy
  1042. if(sFormat=='dd-mm-yyyy'||sFormat=='DD-MM-YYYY'){
  1043. arry = str.split('-');
  1044. if(arry.length==3){
  1045. sYear =arry[2];
  1046. sMonth =arry[1];
  1047. sDay =arry[0];
  1048. str=sDay+'-'+sMonth+'-'+sYear;
  1049. }
  1050. reg= /^([0-3][0-9][-][0-1][0-9][-][1-9][0-9]{3})$/;
  1051. }
  1052. //ddmmyyyy
  1053. if(sFormat=='ddmmyyyy'||sFormat=='DDMMYYYY'){
  1054. if(str.length==8){
  1055. sYear =str.substr(4,4);
  1056. sMonth =str.substr(2,2);
  1057. sDay =str.substr(0,2);
  1058. }
  1059. reg= /^([0-3][0-9][0-1][0-9][1-9][0-9]{3})$/;
  1060. }
  1061. if(sFormat == 'yyyy-mm' || sFormat == 'YYYY-MM'){
  1062. if(str.length==7){
  1063. sYear = str.substr(0,4);
  1064. sMonth = str.substr(5,2);
  1065. sDay = 1+"";
  1066. }
  1067. str = str + "-01";
  1068. reg= /^([1-9][0-9]{3}[-][0-1][0-9][-][0-3][0-9])$/;
  1069. }
  1070. if(!reg.test(str)){
  1071. return false;
  1072. }
  1073. if(!this._fnFWIsDate(sYear,sMonth,sDay)){
  1074. return false;
  1075. }else{
  1076. return true;
  1077. }
  1078. },
  1079. /**
  1080. * 校验校验身份证号码是否正确
  1081. * @param str 身份证号码
  1082. * @returns boolean true/false:如果是合法日期返回true,否则返回false
  1083. * <pre>
  1084. * 使用举例:(该组件内容调用)
  1085. * CFW.oValid._fnFWidcardCheck(str);
  1086. * </pre>
  1087. */
  1088. _fnFWidcardCheck: function(str){
  1089. if(_CHECK_IDCARD){//通过后台校验身份证号
  1090. var sGmsfz='';
  1091. var sFhz='';
  1092. var sMsg='';
  1093. var mParams = {
  1094. "PI_GMSFZ" : str
  1095. };
  1096. var obj=this;
  1097. CFW.oAJax.doProc("PKG_FW_PUB.CHECK_GMSFZ", mParams, '',
  1098. function(mData) {
  1099. sFhz=mData[0].PO_FHZ;
  1100. if(sFhz=='1'){
  1101. sGmsfz=mData[0].PO_GMSFZ;
  1102. }else{
  1103. sMsg=mData[0].PO_MSG;
  1104. }
  1105. },
  1106. function(sMsg){
  1107. },
  1108. false
  1109. );
  1110. if(sFhz=='1'){
  1111. this._IDCARD_TRANS=sGmsfz;
  1112. return true;
  1113. }else{
  1114. this._IDCARD_MSG=sMsg;
  1115. return false;
  1116. }
  1117. }else{
  1118. var i;
  1119. var reg;
  1120. var temp;
  1121. var format;
  1122. var year,month,day;
  1123. format = str.length;
  1124. reg= /^([0-9]{15}|[0-9]{17}[0-9]|[0-9]{17}[xX])$/;
  1125. if(!reg.test(str)){
  1126. this._IDCARD_MSG="公民身份号码输入不合法";
  1127. return false;
  1128. }
  1129. if(format==18){
  1130. temp=str.substring(6,10);
  1131. year=parseInt(temp,10);
  1132. if(year<1900 || year>2200){
  1133. this._IDCARD_MSG="年份应介于1900与2200之间,请重新输入!";
  1134. return false;
  1135. }
  1136. }
  1137. else if(format==15){
  1138. temp=str.substring(6,8);
  1139. year=parseInt(temp,10);
  1140. if(year<00 || year>99){
  1141. this._IDCARD_MSG="年份应介于00与99之间,请重新输入!";
  1142. return false;
  1143. }
  1144. }
  1145. if(format==18){
  1146. temp=str.substring(10,12);
  1147. }
  1148. else if(format==15){
  1149. temp=str.substring(8,10);
  1150. }
  1151. month=parseInt(temp,10);
  1152. if(month<1 ||month>12){
  1153. this._IDCARD_MSG="月份必须介于1与12之间!";
  1154. return false;
  1155. }
  1156. if(format==18){
  1157. temp=str.substring(12,14);
  1158. }
  1159. else if(format==15){
  1160. temp=str.substring(10,12);
  1161. }
  1162. day=parseInt(temp,10);
  1163. if((day==0)||(day>31)){
  1164. this._IDCARD_MSG="日必须介于0与31之间!";
  1165. return false;
  1166. }else if(day>28 && day<31){
  1167. if(month==2){
  1168. if(day!=29){
  1169. this._IDCARD_MSG= year+"年"+month+"月无"+day+"日。";
  1170. return false;
  1171. }
  1172. else {
  1173. if((year%4)!=0){
  1174. this._IDCARD_MSG=year+"年"+month+"月无"+day+"日。";
  1175. return false;
  1176. }
  1177. else {
  1178. if((year%100==0)&&(year%400!=0)){
  1179. this._IDCARD_MSG=year+"年"+month+"月无"+day+"日。";
  1180. return false;
  1181. }
  1182. }
  1183. }
  1184. }
  1185. }
  1186. else if(day==31){
  1187. if((month==2)||(month==4)||(month==6)||(month==9)||(month==11)){
  1188. this._IDCARD_MSG=month+"月无"+day+"日";
  1189. return false;
  1190. }
  1191. }
  1192. //15位转18位
  1193. if(format==15){
  1194. str = this._fnFWidcar15to18(str);
  1195. format = 18;
  1196. }
  1197. //18位
  1198. if(format==18){
  1199. i=(str.substr(0,1)*7+str.substr(1,1)*9+str.substr(2,1)*10+str.substr(3,1)*5+str.substr(4,1)*8+str.substr(5,1)*4+str.substr(6,1)*2+str.substr(7,1)*1+str.substr(8,1)*6+str.substr(9,1)*3+str.substr(10,1)*7+str.substr(11,1)*9+str.substr(12,1)*10+str.substr(13,1)*5+str.substr(14,1)*8+str.substr(15,1)*4+str.substr(16,1)*2 )% 11 ;
  1200. if(i>2)i=12-i;
  1201. else if(i==2)i="X";
  1202. else if(i<2)i=1-i;
  1203. if(str.substr(17,1)==i){
  1204. return true;
  1205. }
  1206. else
  1207. {
  1208. this._IDCARD_MSG="公民身份号码输入不合法,校验位错误! ";
  1209. return false;
  1210. }
  1211. }
  1212. }
  1213. },
  1214. /**
  1215. * 身份证号码15位转18位
  1216. * @param str 身份证号码
  1217. * @returns 返回18位身份证
  1218. * <pre>
  1219. * 使用举例:(该组件内容调用)
  1220. * CFW.oValid._fnFWidcar15to18(str);
  1221. * </pre>
  1222. */
  1223. _fnFWidcar15to18 : function(str){
  1224. var getno=str;
  1225. if(getno.length==15){
  1226. var wi=new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
  1227. var ai=new Array(1,0,'X',9,8,7,6,5,4,3,2);
  1228. var F1=getno.substr(0,6)+"19"+getno.substr(6,15);
  1229. var F2=new Array();
  1230. F2=F1.split("");
  1231. var i=0;
  1232. var j=0;
  1233. var sum =0;
  1234. for(i = 0 ; i<17; i++)
  1235. {
  1236. j = wi[i]*F2[i];
  1237. sum = sum + j;
  1238. }
  1239. sum=sum%11;
  1240. F2[17]=ai[sum];
  1241. var F3=new String();
  1242. for(i=0;i<18;i++){
  1243. if(F2[i]=='X'){
  1244. F3=F3+"X";
  1245. break;
  1246. }
  1247. F3=F3+''+F2[i];
  1248. }
  1249. this._IDCARD_MSG="身份证自动升位为"+F3;
  1250. return F3;
  1251. }else{
  1252. return str;
  1253. }
  1254. },
  1255. /**
  1256. * 校验控件元素,供框架内部使用
  1257. * @param obj 控件元素对象
  1258. * @returns boolean 校验结果,true/false
  1259. * <pre>
  1260. * 使用举例:(该组件内容调用)
  1261. * CFW.oValid._fnFWelementValidate(ele);
  1262. * </pre>
  1263. */
  1264. _fnFWelementValidate: function(obj){
  1265. var readOnly = $(obj).attr('readOnly');
  1266. if ( $(obj).attr('vldStr')==null){
  1267. return null;
  1268. }else if(readOnly){
  1269. return null;
  1270. }
  1271. colName = $(obj).attr('name');// 字段的名称
  1272. validStrs = $(obj).attr('vldStr');
  1273. if($(obj).hasClass('postbox')){
  1274. var s = obj.value;
  1275. if(s.length>0&&s.length!=6){
  1276. return '邮政编码字段不合法!';
  1277. }
  1278. }
  1279. name_validStrs = validStrs.split('=');// 得到字段的中文名称
  1280. if (name_validStrs.length == 2){
  1281. colName = name_validStrs[0];
  1282. validStrs = name_validStrs[1];
  1283. pint=parseInt(obj.value,10);
  1284. pfloat=parseFloat(obj.value,10);
  1285. }
  1286. tmpArray = validStrs.split('+');
  1287. for (j = 0; j < tmpArray.length; j ++){//检查该字段的校验类型
  1288. if (tmpArray[j] == 'nn' && this.fnIsNull(obj.value) && obj.value == ''){//有非空却为空的字段
  1289. return '不能为空!';
  1290. }else if(tmpArray[j] == 'n' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsInteger(obj.value)){//有不合法的数字型字段
  1291. return '数字不合法!';
  1292. }else if(tmpArray[j] == 'h' && !this.fnIsNull(obj.value)){//有不合法的身高型字段
  1293. if(CFW.oValid.fnIsInteger(obj.value) && (pint>0) && (pint<300)){
  1294. }else{
  1295. return '身高不合法!';
  1296. }
  1297. }else if(tmpArray[j] == 'w' && !this.fnIsNull(obj.value)){//有不合法的体重型字段
  1298. if(CFW.oValid.fnIsInteger(obj.value) && (pint>0) && (pint<200)){
  1299. }else{
  1300. return '体重不合法!';
  1301. }
  1302. }else if(tmpArray[j] == 'a' && !this.fnIsNull(obj.value)){//有不合法的年龄型字段
  1303. if(CFW.oValid.fnIsInteger(obj.value) && (pint>0) && (pint<200)){
  1304. }else{
  1305. return '年龄不合法!';
  1306. }
  1307. }else if(tmpArray[j] == 'alm' && !this.fnIsNull(obj.value)){//有不合法的法定男性年龄型字段
  1308. if(CFW.oValid.fnIsInteger(obj.value) && (pint>=16) && (pint<=60)){
  1309. }else{
  1310. return '法定男性年龄(16~60)不合法!';
  1311. }
  1312. }else if(tmpArray[j] == 'alf' && !this.fnIsNull(obj.value)){//有不合法的法定女性年龄型字段
  1313. if(CFW.oValid.fnIsInteger(obj.value) && (pint>=16) && (pint<=55)){
  1314. }else{
  1315. return '法定女性年龄(16~55)不合法!';
  1316. }
  1317. }else if(tmpArray[j] == 'p' && !this.fnIsNull(obj.value)){//有不合法的邮政编码型字段
  1318. if(CFW.oValid.fnIsInteger(obj.value) && (obj.value.length == 6)){
  1319. }else{
  1320. return '邮政编码不合法!';
  1321. }
  1322. }else if(tmpArray[j]=='ml' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsEmail(obj.value)){//有不合法的邮箱字段
  1323. return 'email地址不合法!';
  1324. }else if(tmpArray[j] == 't' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsPhoneNumber(obj.value)){//有不合法的电话号码型字段
  1325. return '电话号码不合法!(格式示例:+86020-12345678)';
  1326. }else if(tmpArray[j] == 'd' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsDate(obj.value)){//有不合法的日期型字典
  1327. return '日期不合法!(格式示例:2005-05-05)';
  1328. }else if(tmpArray[j] == 'dl' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsDateTime(obj.value)){//有不合法的(YYYY-MM-DD HH24:MI:SS)日期型字典
  1329. return '日期不合法!(格式示例:2005-05-05 23:59:59)';
  1330. }else if(tmpArray[j] == 'ds' && !this.fnIsNull(obj.value) && !CFW.oValid._fnIsDateShort(obj.value)){//有不合法的(YYYY-MM)日期型字典
  1331. return '日期不合法!(格式示例:2005-05)';
  1332. }else if(tmpArray[j] == 'dc' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsDateClose(obj.value)){//有不合法的(YYYYMM)日期型字典
  1333. return '日期不合法!(格式示例:200505)';
  1334. }else if(tmpArray[j] == 'dt' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsTime(obj.value)){//有不合法的(HH24:MI:SS)时间型字典
  1335. return '日期不合法!(格式示例:23:59:59)';
  1336. }else if(tmpArray[j] == 'ac' && !this.fnIsNull(obj.value) && !CFW.oValid.fnIsAllChinese(obj.value)){//不合法的纯中文字符串
  1337. return '纯中文字符串不合法!';
  1338. }else if(tmpArray[j] == 'nc' && !this.fnIsNull(obj.value) && CFW.oValid.fnHasChinese(obj.value)){//不合法的非中文字符串
  1339. return '非中文字符串不合法!';
  1340. }else if(tmpArray[j] == 'sfz' && !this.fnIsNull(obj.value) && !CFW.oStr.fnValidSfzh(obj.value)){//有不合法的身份证型字段
  1341. return '身份证不合法!';
  1342. }else if(tmpArray[j] == 's'&& !this.fnIsNull(obj.value)){//有不合法的视力型字段
  1343. if(this.fnCheckFloat(obj.value, 1) && (((pfloat>=0.1) && (pfloat<=1.5))||((pfloat>=4.0)&&(pfloat<=5.2))) ){
  1344. }else{
  1345. return '视力不合法!(示例:0.1~1.5 或者 4.0~5.2)';
  1346. }
  1347. }else if(tmpArray[j] == 'c'&& !this.fnIsNull(obj.value)){//有不合法的颜色型字段
  1348. var c1=obj.value.substr(0,1);
  1349. var c2=obj.value.substr(1,6);
  1350. if((obj.value.length==7) && (c1=="#") && (parseInt(c2,16)>=0) && (parseInt(c2,16)<=16777215)){
  1351. }else{
  1352. return '颜色不合法!';
  1353. }
  1354. }else if(tmpArray[j].substr(0,1) == 'l'){
  1355. var tmpA1=new String();
  1356. tmpA=tmpArray[j];
  1357. var bitL;
  1358. if(arguments.length==2){
  1359. if(options.valLenRule=='char'){
  1360. bitL=(obj.value).length;
  1361. }else{
  1362. bitL=CFW.oStr.fnLengthB(obj.value);
  1363. }
  1364. }else{
  1365. bitL=CFW.oStr.fnLengthB(obj.value);
  1366. }
  1367. var tmpAL=tmpA.length;
  1368. var pos1=tmpA.indexOf("(");
  1369. var pos2=tmpA.indexOf("-");
  1370. var pos3=tmpA.indexOf(")");
  1371. var bitL1=tmpA.substring(pos1+1,pos2);
  1372. var bitL2=tmpA.substring(pos2+1,pos3);
  1373. if(bitL!=0){
  1374. var flag = true;
  1375. if (pos2 < 0) {
  1376. var bitL3 = tmpA.substring(pos1+1,pos3);
  1377. if (CFW.oValid.fnIsInteger(bitL3) && bitL > bitL3) {
  1378. bitL1 = 0;
  1379. bitL2 = bitL3;
  1380. flag = false;
  1381. }
  1382. } else if(CFW.oValid.fnIsInteger(bitL1)&&CFW.oValid.fnIsInteger(bitL2)){
  1383. if(bitL<bitL1||bitL>bitL2){
  1384. flag = false;
  1385. }
  1386. }
  1387. if (!flag) {
  1388. return '长度不合法\n(字母或数字长度应在'+bitL1+'和'+bitL2+'之间,\n汉字长度应在'+Math.floor(parseInt(bitL1)/2)+'和'+Math.floor(parseInt(bitL2)/2)+'之间)';
  1389. }
  1390. }
  1391. }else if(tmpArray[j].indexOf('f')!=-1&&tmpArray[j]!='alf'){ //校验浮点型数据类型
  1392. var tmp = tmpArray[j];
  1393. var len = tmp.length;
  1394. var ips = tmp.indexOf('f');
  1395. var str = "";
  1396. var val = obj.value;
  1397. var ixu =0; //小数位数
  1398. var izu =0; //整数位数
  1399. if(val==''){
  1400. return null;
  1401. }else{
  1402. val = val.replace(/,/gi,'');
  1403. }
  1404. $(obj).css("text-align","right");
  1405. if(!this.fnIsFloat(val)){return '浮点数字不合法,必须为数值!';}
  1406. if(ips!=-1&&(ips+1)!=len){
  1407. str = tmp.split('f');
  1408. ixu = parseInt(str[1],10);
  1409. if(!this.fnCheckFloat(val, ixu)){
  1410. return '浮点数字不合法,必须为'+ixu+'位小数!';
  1411. }
  1412. }else{
  1413. var ips2 = val.indexOf('.');
  1414. if(ips2!=-1){ return '浮点数字不合法,不能带有小数!';}
  1415. }
  1416. str = tmp.split('f');
  1417. if(str[0]==''){
  1418. izu = 1;
  1419. }else{
  1420. izu = parseInt(str[0],10);
  1421. }
  1422. str = val.split('.');
  1423. tmp = str[0];
  1424. len = tmp.length;
  1425. if(parseInt(len,10) > izu){
  1426. return '浮点数字不合法,不能大于'+izu+'位整数!';
  1427. }
  1428. //以下的处理主要是给数值补小数位
  1429. len = 0;
  1430. if(str[1]!=null){
  1431. tmp = str[1];
  1432. len = tmp.length;
  1433. }
  1434. if(ixu!=len){
  1435. tmp ='';
  1436. for(i=len;i<ixu;i++){
  1437. tmp+='0';
  1438. }
  1439. val = obj.value;
  1440. str = val.split('.');
  1441. if(str[1]!=null){
  1442. obj.value = str[0]+'.'+str[1]+tmp;
  1443. }else{
  1444. obj.value = str[0]+'.'+tmp;
  1445. }
  1446. }
  1447. }
  1448. }//for
  1449. return null;
  1450. },
  1451. /**
  1452. * 只允许录入数值
  1453. * @param e 事件event
  1454. * @returns boolean 校验结果,true/false
  1455. * <pre>
  1456. * 使用举例:(该组件内容调用)
  1457. * CFW.oValid._fnFWNumOnly(ele);
  1458. * </pre>
  1459. */
  1460. _fnFWNumOnly: function(e){
  1461. //王码五笔字形无法录入数字的问题
  1462. if(e.keyCode==229){
  1463. return true;
  1464. }
  1465. //左移动
  1466. if(e.keyCode==37){
  1467. return true;
  1468. }
  1469. //右移动
  1470. if(e.keyCode==39){
  1471. return true;
  1472. }
  1473. //小键盘的数字区
  1474. if(e.keyCode >= 96 && e.keyCode <= 105){
  1475. return true;
  1476. }
  1477. //键盘的数字区
  1478. if ((e.keyCode >= 48 && e.keyCode <= 57 && e.ctrlKey == false && e.shiftKey == false)){
  1479. return true;
  1480. }
  1481. return false;
  1482. },
  1483. /**
  1484. * 是否为0或正整数
  1485. * @param sInputVal 被校验的字符串
  1486. * @returns boolean 校验结果,true/false
  1487. * <pre>
  1488. * 使用举例:(该组件内容调用)
  1489. * CFW.oValid._fnIs0AndPosInteger(sInputVal);
  1490. * </pre>
  1491. */
  1492. _fnIs0AndPosInteger : function(sInputVal){
  1493. var format=sInputVal.length;
  1494. if(format==18){
  1495. var lastChar = sInputVal.charAt(sInputVal.length-1);
  1496. if(lastChar=="X")
  1497. sInputVal=sInputVal.substring(0, sInputVal.length-1);
  1498. }
  1499. for (var i = 0; i < sInputVal.length; i++) {
  1500. var oneChar = sInputVal.charAt(i);
  1501. if (oneChar < "0" || oneChar > "9") {
  1502. return false;
  1503. }
  1504. }
  1505. return true;
  1506. },
  1507. /**
  1508. * 拼音字典缓存
  1509. */
  1510. _PINYIN_DICT_CACHE : PINYIN_DICT_CACHE,
  1511. /**
  1512. * 判断拼音是否匹配中文,支持常用中文字,支持多音字。
  1513. * 原理在于将字符串中的中文的的字符转换成英文字符,再用indexOf判断是否匹配。
  1514. * 例如:
  1515. * CFW.oValid._fnIsPinyinMatch('我爱你','wo'),返回是true
  1516. * CFW.oValid._fnIsPinyinMatch('1-单位','1-da'),返回是true
  1517. * CFW.oValid._fnisPinyinMatch('1-单位','wei'),返回是true
  1518. * CFW.oValid._fnIsPinyinMatch('1-单位','dw'),返回是false,不支持中文首字母搜索,需要完整拼音
  1519. * CFW.oValid._fnIsPinyinMatch('着急','zhe'),返回是true,因为“着”是多音字,
  1520. * @param itemText 需要被匹配的含有中文的字符串
  1521. * @param query 拼音
  1522. * @returns 如果拼音匹配则返回true,否则为false
  1523. */
  1524. _fnIsPinyinMatch : function(itemText,query){
  1525. if(itemText==''||itemText==null){return false;}
  1526. //获取存放在左侧树页面的拼音字典
  1527. if(null == PINYIN_DICT_CACHE){
  1528. var twindow = window;
  1529. while(twindow.dialogArguments!=null){
  1530. twindow = twindow.dialogArguments;
  1531. }
  1532. try{
  1533. PINYIN_DICT_CACHE = twindow.top.opener.top.frames['TreeMenu'].PINYIN_DICT_CACHE;
  1534. }catch(e){
  1535. if(null == twindow.top.frames['TreeMenu']){
  1536. return false;
  1537. }
  1538. PINYIN_DICT_CACHE = twindow.top.frames['TreeMenu'].PINYIN_DICT_CACHE;
  1539. if(null == PINYIN_DICT_CACHE){
  1540. return false;
  1541. }
  1542. }
  1543. }
  1544. query = query.toLowerCase();
  1545. var itemTextPinyin = _getPinyin(itemText);
  1546. var bPinyinMatch = false;
  1547. for(var i=0,len=itemTextPinyin.length;i<len;i++){
  1548. if((itemTextPinyin[i].toLowerCase()).indexOf(query)!=-1){
  1549. bPinyinMatch = true;
  1550. break;
  1551. }
  1552. }
  1553. return bPinyinMatch;
  1554. //获取字符串的拼音
  1555. function _getPinyin(hans){
  1556. //多音字的话,会有多种结果,所以用数组保存
  1557. var rst = [];
  1558. var len=hans.length;
  1559. //r是一个二维数组,每个元素数组,存放一个字符的拼音,多音字的拼音有多个
  1560. var r = [];
  1561. var curChar;
  1562. for(var i=0;i<len;i++){
  1563. curChar = hans.charAt(i);
  1564. var pattern = /^([\u4E00-\u9FA5])$/gi;
  1565. var isCh = pattern.test(curChar);
  1566. //如果是汉字
  1567. if(true==isCh){
  1568. //r.push(this._PINYIN_DICT_CACHE[curChar]);
  1569. r.push(PINYIN_DICT_CACHE[curChar]==null?[""]:PINYIN_DICT_CACHE[curChar]);
  1570. }else{
  1571. r.push([curChar]);
  1572. }
  1573. }//for
  1574. //计算笛卡尔积
  1575. rst = _descartes(r);
  1576. return rst;
  1577. }
  1578. //计算笛卡尔积,arr是二维数组,数组的每个元素都是是一个包含一个或多个字符串的数组
  1579. function _descartes(arr){
  1580. var len=arr.length;
  1581. if(1 == len){
  1582. return arr[0];
  1583. }
  1584. var d = _descartesTwo(arr[0],arr[1]);
  1585. for(var i=2;i<len;i++){
  1586. d = _descartesTwo(d,arr[i]);
  1587. }
  1588. return d;
  1589. }
  1590. //计算两个一维数组的笛卡尔积
  1591. function _descartesTwo(arr1,arr2){
  1592. var rst = [];
  1593. for(var i=0,len1=arr1.length;i<len1;i++){
  1594. for(var j=0,len2=arr2.length;j<len2;j++){
  1595. rst.push(arr1[i]+arr2[j]);
  1596. }
  1597. }
  1598. return rst;
  1599. }
  1600. },
  1601. /**
  1602. * Purpose: 判断输入是否为日期 格式:yyyyMM,且为合法的日期
  1603. * Inputs: String
  1604. * Returns: True, False
  1605. */
  1606. fnIsDateClose : function(strDate){
  1607. var strSeparator = "-";
  1608. var strDateArray;
  1609. var intYear;
  1610. var intMonth;
  1611. var intDay;
  1612. var boolLeapYear;
  1613. var charMonth;
  1614. var ln_len=strDate.length;
  1615. if(ln_len!=6) return false;//长度判断
  1616. intYear = parseInt(strDate.substr(0,4));
  1617. intMonth = parseInt(strDate.substr(4,6));
  1618. charMonth = strDate.substr(4,6);
  1619. if(isNaN(intYear)||isNaN(intMonth)) return false;
  1620. if(intYear<1900||intYear>2999) return false;
  1621. if(charMonth>12||charMonth<1) return false;
  1622. return true;
  1623. }
  1624. };