validation.js 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368
  1. /**
  2. * 用于处理表单验证的JS文件 110609 注意:iframe默认是有最大的宽高限制的,要想iframe加载的页面较大时
  3. * 也能自动调整大小,应该为iframe的css样式增加:width: 100%;height: 100%; 否则iframe大到一定程序就不能再大了
  4. */
  5. var validationManagerPath = '/wd/js/validation';
  6. // 为真,则在用户输入数据时实现进行检查
  7. var realTimeCheck = true;
  8. var chartDiv;
  9. var validationTimeOutId = null;
  10. if (realTimeCheck) { // 如果需要在用户输入数据时实现进行检查,则把相应的iframe写入页面
  11. /*
  12. * var divStr = '<div style="position: absolute; z-index: 19701; top:
  13. * -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
  14. * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
  15. * scrolling="no" frameborder="0" style="visibility: visible;position:
  16. * absolute; width: 100%; height: 100%;"></iframe></div></div>'; var
  17. * topBody = top.document.getElementsByTagName('BODY')[0]; topBody.innerHTML =
  18. * divStr;
  19. */
  20. // alert(window.top.document.getElementsByTagName("body")[0]);
  21. // document.write('<div style="position: absolute; z-index: 65535; top:
  22. // -500px" id="msgDiv"><div id="validationDiv"><iframe name="msgIframe"
  23. // id="msgIframe" src="'+validationManagerPath+
  24. // '/validationMsg.html" scrolling="no" frameborder="0"
  25. // style="visibility: visible;position: absolute; width: 100%; height:
  26. // 100%;"></iframe></div></div>');
  27. var topDoc = top.document;
  28. chartDiv = topDoc.getElementById('msgDiv');
  29. if (chartDiv == null || typeof(chartDiv) == 'undefined') {
  30. chartDiv = topDoc.createElement('div');
  31. topDoc.body.appendChild(chartDiv);
  32. chartDiv.id = 'msgDiv';
  33. chartDiv.innerHTML += '<div id="validationDiv" class="flashMsg-div" ><span class="msgDiv-content"></span><div class=\"msgDiv-tail\"></div></div>';
  34. // chartDiv.innerHTML = '<img
  35. // src="<%=request.getContextPath()%>/images/kpiUp.jpg" />';//错误的
  36. with (chartDiv.style) {
  37. zIndex = 65535;
  38. position = 'absolute';
  39. // background = '#F5F5F5';
  40. width = "auto";
  41. height = 0;
  42. top = -500;
  43. left = 0;
  44. // border = "1px solid";
  45. display = 'block';
  46. style = 'position:absolute;border-radius:3px;overflow:hidden;';
  47. }
  48. }
  49. }
  50. // 保存校验结果的变量
  51. var message = "";
  52. function ValidationManager() { // 用于处理表单验证的工具类构造器
  53. /** 保存所有要校验的信息的集合* */
  54. this.validationInfos = [];
  55. }
  56. ValidationManager.MSG_TYPE_SUCCESS = 0; // 消息类型――正确
  57. ValidationManager.MSG_TYPE_ERROR = 1; // 消息类型――错误
  58. ValidationManager.MSG_TYPE_WARNING = 2; // 消息类型――警告
  59. ValidationManager.prototype = {
  60. /** 用于显示表单验证结果的Div* */
  61. MsgDiv: chartDiv,
  62. /** 如果为真,则如果代码报错会alert出来,在实际项目中应设为false* */
  63. debug: true,
  64. /** 通过NAME或ID获得页面元素的通用方法* */
  65. getElement: function (nameOrId) {
  66. var rs = document.getElementById(nameOrId);
  67. if (!rs) { // 如果上面的方法失败,则采用下面的方法取得对象实例
  68. var arr = document.getElementsByName(nameOrId);
  69. if (arr != null)
  70. rs = arr[0];
  71. }
  72. console.log(rs)
  73. return rs;
  74. },
  75. getElements: function (nameOrId) {
  76. var rs = new Array();
  77. var ele = document.getElementById(nameOrId);
  78. if (!ele) { // 如果上面的方法失败,则采用下面的方法取得对象实例
  79. var arr = document.getElementsByName(nameOrId);
  80. if (arr != null) {
  81. for (var i = 0; i < arr.length; i++) {
  82. rs.push(arr[i])
  83. }
  84. }
  85. } else {
  86. rs.push(ele)
  87. }
  88. // console.log(rs)
  89. return rs;
  90. },
  91. /** 获取参数s指定的方法引用* */
  92. getFunRef: function (s) {
  93. if (!s)
  94. return null;
  95. try {
  96. var r = eval(s);
  97. } catch (e) {
  98. //alert("方法不存在 :"+s)
  99. console.log("方法不存在 :" + s)
  100. }
  101. return r;
  102. },
  103. /**
  104. * 为DOM元素targetElem的evenName事件追加事件触发时回调函数activeFun
  105. * 通过此函数为DOM元素绑定监听事件的好处在于:可以把新添加的监听函数与DOM元素
  106. * 已绑定的旧的监听函数合并成为新的监听函数,而不会覆盖DOM元素旧的同名监听函数。
  107. */
  108. addEventListener: function (targetElem, // 需绑定监听事件的DOM元素
  109. eventName, // 事件名称,如:onclick
  110. activeFun) { // 事件触发的回调函数
  111. // DOM元素原来的监听事件
  112. var oriListener = targetElem[eventName];
  113. if (oriListener) { // 如果原来已经存在同名的监听事件了
  114. targetElem[eventName] = function () {
  115. oriListener.call(targetElem); // 调用原来已经存在监听方法
  116. activeFun.call(targetElem); // 调用新添加的监听方法
  117. }
  118. } else {
  119. targetElem[eventName] = function () {
  120. activeFun.call(targetElem); // 调用新添加的监听方法
  121. }
  122. }
  123. },
  124. /** 当前页面的第一个FORM元素* */
  125. form: null,
  126. /** 用于显示表单验证结果的iframe的Id或Name* */
  127. MsgIframeIdorName: 'msgIframe',
  128. /** 用于显示表单验证结果的div的Id或Name* */
  129. MsgDivIdorName: 'msgDiv',
  130. /** 用于显示表单验证结果的iframe* */
  131. MsgIframe: null,
  132. /** 已经初始化成功* */
  133. initOk: false,
  134. /**
  135. * 如果表单存在,则为表单绑定onsubmit校验事件
  136. *
  137. * @param {}
  138. * targetForm 需要校验的FORM的name或者ID
  139. * @return {Boolean} 返回校验结果,为真则校验通过
  140. */
  141. checkForm: function (targetForm) {
  142. try {
  143. var THIS = this;
  144. if (!targetForm) { // 如果目标form不存在
  145. //alert('checkForm方法执行出错,参数不能为空!');
  146. console.log('checkForm方法执行出错,参数不能为空!');
  147. return;
  148. }
  149. if ((typeof targetForm).toUpperCase() == 'STRING') // 如果输入的是FORM的name或者ID
  150. var targetForm = this.getElement(targetForm);
  151. if (!targetForm.validationManager) { // 如果FORM中没校验器,则添加一个校验器
  152. targetForm.validationManager = this;
  153. var activeFun = function (showerror) { // 为表单绑定onsubmit事件
  154. try{
  155. if(window.beforeBatchSubmit){
  156. window.beforeBatchSubmit();
  157. }
  158. }catch(e){
  159. console.log(e);
  160. }
  161. var rsArr = targetForm.validationManager.checkAll(
  162. targetForm.validationManager.validationInfos);
  163. var totalMsg = ''; // 保存校验显示的消息
  164. for (var i = 0; i < rsArr.length; i++) {
  165. var rs = rsArr[i];
  166. var msg = rs.msg;
  167. var regExp = /[\n\r]+$/; // 测试校验结果结尾有没有换行符的正则表达式
  168. var hasLineBreak; // 有换行符
  169. hasLineBreak = regExp.test(msg);
  170. // if(hasLineBreak)//如果有换行符
  171. // totalMsg+=msg;
  172. // else
  173. totalMsg += msg + '<br>';
  174. }
  175. if (totalMsg) { // 如果校验不通过
  176. if (showerror == false)
  177. return false; //如果不显示错误
  178. try {
  179. var windowId = new Date().getTime();
  180. var width = 400;
  181. var high = 400;
  182. // wd.topWindow.dhxWins.enableAutoViewport(true);//让窗口大小自动适应内容
  183. var w = wd.topWindow.dhxWins.createWindow(windowId, 0, 0, width, high);
  184. //----------------加遮罩层开始 ----------------
  185. if (!wd.topWindow.wd.display.wdDialogOpeners) {
  186. wd.topWindow.wd.display.wdDialogOpeners = {};
  187. }
  188. var wdDialogId = windowId;
  189. wd.topWindow.wd.display.wdDialogOpeners[wdDialogId] = window;
  190. var containerObj = wd.topWindow.wd.display;
  191. if (wd.topWindow.document.querySelector("#validationTotalMsg")) {
  192. wd.topWindow.document.querySelector("#validationTotalMsg").close();
  193. }
  194. //----------------加遮罩层结束 ----------------
  195. w.keepInViewport(true); // 保持在窗口内
  196. w.center(); // 居中
  197. var title = '<span style="font-size: 18px; \'宋体\'\;line-height:30px; color: #333;margin-left: 5px;" >录入数据错误</span>';
  198. w.setText(title); // 设置窗口标题
  199. w.setModal(true); // 设置模式窗口
  200. w.bringToTop(); // 置顶
  201. // 隐藏不需要的按钮
  202. // alert(document.getElementById("mainContainer")==wd.topWindow.document.body);
  203. if (w.button('help'))
  204. w.button('help').hide();
  205. if (w.button('stick'))
  206. w.button('stick').hide();
  207. if (w.button('sticked'))
  208. w.button('sticked').hide();
  209. if (w.button('park'))
  210. w.button('park').hide();
  211. if (w.button('minmax1')) // 隐藏最大化按钮
  212. w.button('minmax1').hide();
  213. w.denyResize(); // 不允许改变大小
  214. var innerDiv = '<div id="innerFrame" class="scrollbar" style="width: ' + (width - 5) + ';height:calc(100% - 53px);display:flex;align-items:center;justify-content: space-around;overflow:auto;line-height:30px;font-size:16px;color:red;box-sizing:border-box;padding-left:15px;" >' + totalMsg +
  215. '</div><div class="bottom-div" style="position:absolute;"><div class="bottom-down-div"><input type="button" value="关闭" class="bottom-button" id="closeButton" style="letter-spacing: 6px;"></div></div></div>';
  216. w.attachHTMLString(innerDiv);
  217. w.setAttribute("id", "validationTotalMsg");
  218. var currentDialogZIndex = w.zi; // 弹出窗口的z-index
  219. wd.display.dxwindowsCreateMaskDiv(currentDialogZIndex);
  220. w.attachEvent("onClose", function (win) {
  221. wd.display.dxwindowsCloseMaskDiv(); //关闭wddialog时,移除遮罩层
  222. return true;
  223. });
  224. try {
  225. wd.display.initStyleWdButtons();
  226. $(w).on("click", "#closeButton", function () {
  227. w.close();
  228. })
  229. } catch (e) {
  230. console.log(e);
  231. }
  232. var divArr = wd.topWindow.document.querySelectorAll("[ida=dhxMainCont]");
  233. for (var i = 0; i < divArr.length; i++) {
  234. divArr[i].style.backgroundColor = "";
  235. }
  236. } catch (e) {
  237. //alert(totalMsg);// 弹出校验结果
  238. }
  239. THIS.hideMsgDiv();
  240. return false;
  241. } else
  242. return true;
  243. }; //end function
  244. //如果用户直接调用form的submit方法,则校验不会生效。因此,这里覆盖原来form的submit方法\
  245. targetForm.oriSubmit = targetForm.submit;
  246. targetForm.checkOnly = function (boo) {
  247. boo = (typeof boo == "undefined") ? true : boo;
  248. // !(boo == null ? true : boo);
  249. return activeFun(boo);
  250. };
  251. targetForm.submit = function () {
  252. if (activeFun())
  253. targetForm.oriSubmit();
  254. };
  255. wd.c.addEventListener(targetForm, //需绑定监听事件的DOM元素
  256. 'onsubmit', //事件名称,如:onclick
  257. activeFun);
  258. }
  259. } catch (e) {
  260. if (this.debug)
  261. //alert('方法checkForm执行异常:'+e);
  262. console.log('方法checkForm执行异常:' + e);
  263. }
  264. },
  265. /** 如果为真则自动为当前页面的第一个表单绑定onsubmit校验事件* */
  266. formAutoCheck: true,
  267. /** 初始化变量的方法,只需执行一次* */
  268. init: function () {
  269. try {
  270. if (this.initOk)
  271. return; // 如果已经初始化过了,就返回。
  272. if (!this.MsgIframe)
  273. this.MsgIframe = this.getElement(this.MsgIframeIdorName);
  274. if (!this.MsgDiv)
  275. this.MsgDiv = this.getElement(this.MsgDivIdorName);
  276. if (this.formAutoCheck) {
  277. // var forms = document.getElementsByTagName('form');
  278. var forms=$("form:visible");//过滤隐藏form
  279. this.form = forms[forms.length - 1]; // 当前页面的第一个FORM元素
  280. if (this.form) { // 如果表单存在,则为表单绑定onsubmit事件
  281. this.checkForm(this.form);
  282. }
  283. }
  284. this.initOk = true;
  285. } catch (e) {
  286. if (this.debug)
  287. //alert('方法init执行异常:'+e);
  288. console.log('方法init执行异常:' + e);
  289. }
  290. },
  291. /** 设定显示表单验证结果的iframe的显示内容* */
  292. setMsg: function (rsArr) {
  293. // try{
  294. // 调用iframe中的方法,设置表单验证结果的iframe的显示内容
  295. if (!rsArr || rsArr.length == 0)
  296. return;
  297. // console.log(rsArr)
  298. //this.MsgDiv.firstChild.innerHTML = rsArr[0].msg + "<div class=\"flashMsg-up warningFlashMsg-up\"></div>";
  299. this.MsgDiv.querySelector(".msgDiv-content").innerHTML=rsArr[0].msg;
  300. // 暂时隐藏20181128
  301. // window.top.frames[this.MsgIframeIdorName].setMsg(rsArr);
  302. // alert(document.frames.length);
  303. // }catch(e){
  304. // if(this.debug)
  305. // alert('方法setMsg执行异常:'+e.message);
  306. // }
  307. },
  308. /**
  309. * 返回传入对象e的绝对坐标,并作为一个对象返回
  310. *
  311. * @param {}
  312. * e
  313. * @return {"x": x, "y": y}
  314. */
  315. getAbsPoint: function (e) {
  316. try {
  317. var x = e.offsetLeft;
  318. var y = e.offsetTop;
  319. var w = e.offsetWidth;
  320. var h = e.offsetHeight;
  321. /**
  322. * OffsetParent为从中计算偏移量的元素。 如果某个元素的父级或此元素层次结构中的其他元素使用相对或绝对定位, 则 OffsetParent
  323. * 将成为当前元素嵌套到的第一个相对或绝对定位元素。如果当前元素以上的任何元素都不是绝对 或相对定位的,则 OffsetParent 将是文档的
  324. * BODY 标记。
  325. *
  326. * obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。 obj.offsetLeft 指 obj
  327. * 距离左方或上层控件的位置,整型,单位像素。
  328. *
  329. * offsetTop与offsetLeft均为相对偏移量,但是下面不断地拿offsetParent的偏移量来累加,
  330. * 直至拿到offsetParent为body之后,就没有offsetParent了,此时循环才终止。
  331. * 最终计算出来的x,y为e相对body的绝对坐标。
  332. */
  333. while (e = e.offsetParent) { // 只要对象的offsetParent存在,则继续累加XY,
  334. x += e.offsetLeft;
  335. y += e.offsetTop;
  336. }
  337. return {
  338. "x": x,
  339. "y": y,
  340. "w": w,
  341. "h": h
  342. };
  343. } catch (e) {
  344. if (this.debug)
  345. //alert('方法getAbsPoint执行异常:'+e);
  346. console.log('方法getAbsPoint执行异常:' + e);
  347. }
  348. },
  349. /**
  350. * refleshIframeFun:function(){ if(!this.hasRefleshedIframe){
  351. * document.getElementById("validationDiv").innerHTML='<iframe name="msgIframe"
  352. * id="msgIframe" src="'+validationManagerPath+ '/validationMsg.html"
  353. * scrolling="no" frameborder="0" style="visibility: visible;position: absolute;
  354. * width: 100%; height: 100%;"></iframe>'; this.hasRefleshedIframe = true; } },
  355. */
  356. /**
  357. * MsgDiv定位于要校验的目标input元素的上方
  358. *
  359. * @param {}
  360. * targetInput 要校验的目标input元素
  361. */
  362. showMsgDiv: function (targetInput,msg) {
  363. try{
  364. wd.flashMsg.show({
  365. el: targetInput, // 吸附的元素
  366. msg: msg, // 内容
  367. animate:false
  368. });
  369. }catch(e){
  370. console.log(e);
  371. }
  372. if(true)return;
  373. // try{
  374. // this.refleshIframeFun();
  375. var win = window;
  376. var xy = this.recursionIframe(win);
  377. // var inputElem = document.getElementsByName(targetInput.name)[0];
  378. var offset = this.getInputOffset(targetInput, true);
  379. var height = this.MsgDiv.offsetHeight;
  380. this.MsgDiv.style.left = xy.x + offset.left + "px";
  381. var tailDiv=this.MsgDiv.querySelector(".msgDiv-tail");
  382. var msgtop;
  383. if(offset.top<window.innerHeight/2){
  384. //录入框下方,尾巴向上
  385. msgtop=xy.y + offset.top + 38 + "px";
  386. tailDiv.setAttribute("class","msgDiv-tail flashMsg-up");
  387. }else{
  388. //录入框上方,尾巴向下
  389. msgtop=xy.y + offset.top - height - 38 + "px";
  390. tailDiv.setAttribute("class","msgDiv-tail flashMsg-down");
  391. }
  392. this.MsgDiv.style.top=msgtop;
  393. // 调用隐藏的方法,让tips在3s后隐藏
  394. var dom = this.MsgDiv
  395. function hideDom(dom) {
  396. dom.style.top = "-500px"
  397. }
  398. if (validationTimeOutId)
  399. clearTimeout(validationTimeOutId);
  400. validationTimeOutId = setTimeout(function () {
  401. hideDom(dom)
  402. }, 3000);
  403. /**
  404. * }catch(e){ if(this.debug) alert('方法执行异常:'+e); }
  405. */
  406. },
  407. /**
  408. * 获取输入光标在页面中的坐标 【..】
  409. *
  410. * @param {HTMLElement}
  411. * 输入框元素
  412. * @param {Boolean}
  413. * 返回焦点光标顶部的top值(默认false)
  414. * @return {Object} 返回left和top
  415. */
  416. getInputOffset: function (elem, focusTop) {
  417. var that = this,
  418. cloneDiv = '{$clone_div}',
  419. cloneLeft = '{$cloneLeft}',
  420. cloneFocus = '{$cloneFocus}',
  421. cloneRight = '{$cloneRight}',
  422. none = '<span style="white-space:pre-wrap;"> </span>',
  423. div = elem[cloneDiv] || document.createElement('div'),
  424. left = elem[cloneLeft] || document.createElement('span'),
  425. focus = elem[cloneFocus] || document.createElement('span'),
  426. right = elem[cloneRight] || document.createElement('span'),
  427. offset = that._offset(elem),
  428. index = this._getFocus(elem),
  429. focusOffset = {
  430. left: 0,
  431. top: 0
  432. };
  433. div.style.width = this._getStyle(elem, 'width');
  434. div.style.height = this._getStyle(elem, 'height');
  435. try {
  436. div.scrollLeft = elem.scrollLeft;
  437. div.scrollTop = elem.scrollTop;
  438. } catch (e) {}; // IE8
  439. left.innerHTML = ((elem.value && elem.value.substring(0, index)) || "").
  440. replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>').replace(/\s/g, none);
  441. right.innerHTML = ((elem.value && elem.value.substring(index, elem.value.length) || "")).
  442. replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br/>').replace(/\s/g, none);
  443. focus.style.display = 'inline-block';
  444. try {
  445. focusOffset = this._offset(focus);
  446. } catch (e) {};
  447. focus.style.display = 'none';
  448. return {
  449. left: offset.left + focusOffset.left,
  450. top: offset.top + focusOffset.top + (focusTop ? focus.offsetHeight : 0)
  451. };
  452. },
  453. // 获取元素在页面中位置
  454. _offset: function (elem) {
  455. var box = elem.getBoundingClientRect();
  456. var doc = elem.ownerDocument;
  457. var body = doc.body;
  458. var docElem = doc.documentElement;
  459. var clientTop = docElem.clientTop || body.clientTop || 0;
  460. var clientLeft = docElem.clientLeft || body.clientLeft || 0;
  461. var top = box.top + (self.pageYOffset || docElem.scrollTop) - clientTop;
  462. var left = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;
  463. return {
  464. left: left,
  465. top: top
  466. };
  467. },
  468. // 获取光标在文本框的位置
  469. _getFocus: function (elem) {
  470. var index = 0;
  471. if (elem.nodeName === 'TEXTAREA') {
  472. if (document.selection) { // IE Support
  473. elem.focus();
  474. var Sel = document.selection.createRange();
  475. var Sel2 = Sel.duplicate();
  476. Sel2.moveToElementText(elem);
  477. var index = -1;
  478. while (Sel2.inRange(Sel)) {
  479. Sel2.moveStart('character');
  480. index++;
  481. };
  482. } else if (elem.selectionStart || elem.selectionStart == '0') { // Firefox
  483. // support
  484. index = elem.selectionStart;
  485. };
  486. return (index);
  487. } else { // input
  488. if (document.selection) { // IE Support
  489. elem.focus();
  490. var Sel = document.selection.createRange();
  491. Sel.moveStart('character', -elem.value.length);
  492. index = Sel.text.length;
  493. } else if (elem.selectionStart || elem.selectionStart == '0') { // Firefox
  494. // support
  495. index = elem.selectionStart;
  496. };
  497. return (index);
  498. };
  499. },
  500. // 获取最终样式
  501. _getStyle: 'getComputedStyle' in window ? function (elem, name) {
  502. return getComputedStyle(elem, null)[name];
  503. }
  504. : function (elem, name) {
  505. return elem.currentStyle[name];
  506. },
  507. /** 隐藏MsgDiv的方法* */
  508. hideMsgDiv: function () {
  509. // try{
  510. // this.MsgDiv.style.top = "-500px";
  511. /**
  512. * }catch(e){ if(this.debug) alert('方法showMsgD\niv执行异常:'+e); }
  513. */
  514. try{
  515. wd.flashMsg.clear();
  516. }catch(e){
  517. console.log(e);
  518. }
  519. },
  520. /**
  521. * 为指定的input元素绑定校验方法的公共方法
  522. */
  523. initInput: function (validationInfo) {
  524. try {
  525. this.init(); // 初始化变量的方法
  526. this.validationInfos.push(validationInfo);
  527. for (var i = 0; i < validationInfo.formElems.length; i++) {
  528. // 被校验的表单元素
  529. var targetInput = validationInfo.formElems[i];
  530. // 保存校验信息到表单元素中
  531. if (!targetInput.validationInfos) {
  532. targetInput.validationInfos = [];
  533. }
  534. targetInput.validationInfos.push(validationInfo);
  535. // console.log(targetInput.validationInfos)
  536. /** 保存原来的borderBottomColor* */
  537. if (targetInput.style.borderBottomColor)
  538. targetInput.oldBorderColor = targetInput.style.borderBottomColor;
  539. else
  540. targetInput.oldBorderColor = 'default';
  541. targetInput.validationManager = this;
  542. // $(targetInput).addClass("validation-"+targetInput.tagName.toLowerCase());
  543. $(targetInput).addClass("border-" + targetInput.tagName.toLowerCase());
  544. if (realTimeCheck) { // 如果要进行实时检查
  545. var activeFun = function () {
  546. //if(this.value!==''&&this.value!==null){
  547. this.validationManager.checkForRealTime(this); // 检查目标input元素的值
  548. /*
  549. }else{
  550. this.style.borderBottomColor='';//清空则去掉红框
  551. this.validationManager.hideMsgDiv();// 隐藏MsgDiv
  552. }
  553. */
  554. // targetInput.style.borderBottomColor="blue"
  555. };
  556. /** 为要校验的input元素绑定获得焦点事件* */
  557. this.addEventListener(targetInput, // 需绑定监听事件的DOM元素
  558. 'onfocus', // 事件名称,如:onclick
  559. activeFun); // 事件触发的回调函数
  560. this.mouseoverEvent(targetInput, activeFun);
  561. /** 为要校验的input元素绑定失去焦点事件* */
  562. var onblurFun = function () {
  563. // 隐藏MsgDiv 暂时去掉20181128
  564. // this.validationManager.hideMsgDiv();
  565. // targetInput.style.borderBottomColor=""
  566. };
  567. this.addEventListener(targetInput, // 需绑定监听事件的DOM元素
  568. 'onblur', // 事件名称,如:onclick
  569. onblurFun); // 事件触发的回调函数
  570. //初始化ueditor的校验事件
  571. if ((typeof EditorManager != "undefined") && EditorManager && (validationInfo.argsObj.isUeditor == true || validationInfo.argsObj.isUeditor == "true")) {
  572. var vmr = this;
  573. window.ueCallback = window.ueCallback || [];
  574. var name = validationInfo.argsObj.editorName;
  575. window.ueCallback[name] = window.ueCallback[name] || [];
  576. window.ueCallback[name].push(function () {
  577. EditorManager.getWDEditor(validationInfo.argsObj.editorName)
  578. .getUeditor().addListener("selectionchange", function () {
  579. // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
  580. // 'onblur', // 事件名称,如:onclick
  581. // onblurFun);
  582. // vmr.addEventListener(targetInput, // 需绑定监听事件的DOM元素
  583. // 'onfocus', // 事件名称,如:onclick
  584. // activeFun); // 事件触发的回调函数
  585. var iframe_ = EditorManager.getEditorFrame(name);
  586. iframe_.validationInfo = targetInput.validationInfo;
  587. iframe_.validationInfos = targetInput.validationInfos;
  588. iframe_.validationManager = targetInput.validationManager;
  589. onblurFun.call(iframe_);
  590. activeFun.call(iframe_);
  591. });
  592. });
  593. }
  594. // if(targetInput.tagName.toUpperCase()=='SELECT'){// 如果要校验的不是select元素
  595. // /** 为要校验的input元素绑定键盘点击事件* */
  596. // this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
  597. // 'onkeyup',// 事件名称,如:onclick
  598. // activeFun);// 事件触发的回调函数
  599. // }else{
  600. //
  601. // /** 为要校验的input元素绑定键盘点击事件* */
  602. // this.addEventListener(targetInput,// 需绑定监听事件的DOM元素
  603. // 'onchange',// 事件名称,如:onclick
  604. // activeFun);// 事件触发的回调函数
  605. // }
  606. var eventType = null;
  607. //选择合适的时间为元素绑定
  608. //select
  609. if (targetInput.tagName == "SELECT") {
  610. eventType = "onchange"
  611. //input
  612. } else if (targetInput.tagName == "INPUT" || targetInput.tagName == "TEXTAREA") {
  613. eventType = "onkeyup"
  614. if (targetInput.type == "button") {
  615. eventType = "onclick"
  616. }
  617. //button
  618. } else if (targetInput.tagName == "button") {
  619. eventType = "onclick"
  620. }
  621. if (eventType == null) {
  622. console.log(targetInput);
  623. console.log("元素不支检验")
  624. //alert("元素不支检验")
  625. return;
  626. }
  627. //为元素绑定即时校验事件
  628. this.addEventListener(targetInput, // 需绑定监听事件的DOM元素
  629. eventType, // 事件名称,如:onclick
  630. activeFun); // 事件触发的回调函数
  631. }
  632. } // for
  633. //预校验,不用等到提交表单才校验 By Rd 2015-11-12
  634. this.checkAll(targetInput.validationInfos);
  635. // this.MsgDiv.style.top = "-500px"
  636. this.hideMsgDiv();
  637. } catch (e) {
  638. console.log(e);
  639. if (this.debug)
  640. //alert('方法initInput执行异常:'+e);
  641. console.error('方法initInput执行异常:' + e);
  642. }
  643. },
  644. /**
  645. * 为指定的表单元素绑定校验方法
  646. */
  647. add: function (validatorStr, // 内容为校验方法全路径的字符串
  648. formElems, // 被校验的表单元素的name或id
  649. argsObj, // 内容为当前校验器使用的参数组成的关联数组
  650. type) { // 校验结果严重等级
  651. try {
  652. if (!type)
  653. type = ValidationManager.MSG_TYPE_ERROR;
  654. var validationInfo = {}; // 保存一次校验所需信息的集合
  655. validationInfo.funRef = this.getFunRef(validatorStr); // 校验器方法引用
  656. validationInfo.argsObj = argsObj; // 内容为当前校验器使用的参数组成的关联数组
  657. validationInfo.type = type; // 校验结果严重等级
  658. validationInfo.formElems = []; // 被校验的表单元素
  659. validationInfo.isNull=function(){
  660. return this.formElems[0].value?false:true;
  661. }
  662. // validationInfo.formElems=this.getElements(eName);
  663. //查找表单元素
  664. for (var i = 0; i < formElems.length; i++) {
  665. var eName = formElems[i];
  666. if (growHeightList && growHeightList[eName]) {
  667. var gh = growHeightList[eName];
  668. var elems = [gh.getInputElement()];
  669. if (elems)
  670. validationInfo.formElems = validationInfo.formElems.concat(elems);
  671. } else {
  672. var elems = this.getElements(eName);
  673. if (elems)
  674. validationInfo.formElems = validationInfo.formElems.concat(elems);
  675. }
  676. }
  677. //bmxy1.xy
  678. //批量录入
  679. if(formElems[0].split(/\./).length==2){
  680. argsObj["namePrefix"]=formElems[0].split(/\./)[0]+".";
  681. }else{
  682. argsObj["namePrefix"]="";
  683. }
  684. validationInfo.name=formElems[0];
  685. // console.log(validationInfo)
  686. //只有找到对应表单元素时才绑定校验方法 张敏聪2015-10-30
  687. if (validationInfo.formElems.length > 0) {
  688. // 为指定的input元素绑定校验方法的公共方法
  689. this.initInput(validationInfo);
  690. }
  691. } catch (e) {
  692. if (this.debug)
  693. console.log('方法add执行异常:' + e);
  694. //alert('方法add执行异常:'+e);
  695. }
  696. },
  697. /**
  698. * 执行一次校验
  699. *
  700. * @param {}
  701. * validationInfo 保存一次校验的配置的对象
  702. * 单个校验
  703. */
  704. check: function (validationInfo, targetinput) {
  705. var rs = {}; // 保存校验结果的对象
  706. var funRef = validationInfo.funRef; // 校验器方法引用
  707. var argsObj = validationInfo.argsObj; // 内容为当前校验器使用的参数组成的关联数组
  708. var type = validationInfo.type; // 校验结果严重等级
  709. // console.log(targetinput.validationInfos)
  710. var funArgs = [];
  711. //2017-12-4 zhangmincong radio判断
  712. // if (targetinput.type && 'radio|checkbox'.indexOf(targetinput.type.toLowerCase()) > -1) {
  713. // var rdos = document.querySelectorAll("[type='" + targetinput.type + "'][name='" + targetinput.name + "']"),
  714. // value;
  715. // console.log(rdos)
  716. // for (var i = 0; i < rdos.length; i++) {
  717. // console.log(rdos[i].checked)
  718. // if (rdos[i].checked == true) {
  719. // value = rdos[i].value;
  720. // break;
  721. // }
  722. // }
  723. // funArgs.push([value]);
  724. // } else if ((typeof EditorManager != "undefined") && (argsObj.isUeditor == true || argsObj.isUeditor == "true")) {
  725. // if (EditorManager.getWDEditor(argsObj.editorName)) {
  726. // var value = EditorManager.getWDEditor(argsObj.editorName).getUeditor().getContent();
  727. // value = wd.display.toPlainText(value);
  728. // // console.log("ueditorValue:"+value);
  729. // funArgs.push([value]);
  730. // }
  731. // } else if (targetinput.tagName == "DIV") {
  732. // funArgs.push([targetinput.innerHTML])
  733. // } else if (targetinput.GrowHeight) {
  734. // funArgs.push([targetinput.GrowHeight.val()]);
  735. // } else {
  736. // funArgs.push([targetinput.value])
  737. // }
  738. // console.log(targetinput);
  739. // funArgs.push(argsObj)
  740. // var win = window;
  741. // var xy = this.recursionIframe(win);
  742. // 调用校验器进行校验
  743. var msg;
  744. try {
  745. // msg = funRef.apply(window, funArgs);
  746. //校验器获取根据name获得其他录入
  747. var environment={
  748. argsObj:argsObj
  749. ,getElementValue:function(name){//单个或 批量 取值
  750. var n=this.argsObj.namePrefix+name;
  751. //id查找
  752. var ele=document.querySelector("input[id='"+n+"']");
  753. if(ele)return ele.value;
  754. //name查找
  755. var box= wd.display.getInputBox(n,true);
  756. return box?box.getValue():null;
  757. }
  758. ,setElementValue:function(name,value){//单个或 批量 设值.....自动填写性别、出生地区、出生日期
  759. var n=this.argsObj.namePrefix+name;
  760. //name查找
  761. var box= wd.display.getInputBox(n,true);
  762. if(!box){
  763. console.log("set value fail:"+n);
  764. return ;
  765. }
  766. box.setValue(value);
  767. },modify:function(names,canModify){//names:["xm","xbm"] 录入可修改,不可修改
  768. for(var i=0;i<names.length;i++){
  769. var n=this.argsObj.namePrefix+names[i];
  770. var box= wd.display.getInputBox(n);
  771. if(box){
  772. box.modify(canModify);
  773. }
  774. }
  775. }
  776. };
  777. var vbox= wd.display.getInputBox(validationInfo.name,true);
  778. var vv=vbox?vbox.getValue():"";
  779. funArgs.push([vv]);
  780. funArgs.push(argsObj);
  781. msg = funRef.apply(environment, funArgs);
  782. } catch (e) {
  783. console.error(e);
  784. msg = "校验方法错误:" + validationInfo.funRef;
  785. }
  786. // 保存校验信息
  787. rs.msg = msg;
  788. rs.formElems = [targetinput];
  789. if (msg) // 如果校验不通过
  790. rs.type = type;
  791. else
  792. rs.type = ValidationManager.MSG_TYPE_SUCCESS;
  793. // console.log(rs);
  794. return rs;
  795. },
  796. checks: function (validationInfo, targetInput) {
  797. var result = []
  798. if (targetInput) {
  799. var elem = targetInput
  800. var rs = this.check(validationInfo, elem);
  801. //校验未通过
  802. if (rs.msg && rs.msg.length > 0) {
  803. result.push(rs)
  804. elem.style.borderBottomColor = 'red';
  805. } else { //通过
  806. this.hideMsgDiv()
  807. // 如果运行到这里证明校验通过
  808. if (elem.oldBorderColor == 'default')
  809. elem.style.borderBottomColor = '';
  810. else
  811. elem.style.borderBottomColor = elem.oldBorderColor;
  812. }
  813. } else {
  814. for (var i = 0; i < validationInfo.formElems.length; i++) {
  815. var elem = validationInfo.formElems[i];
  816. var rs = this.check(validationInfo, elem);
  817. // console.log(rs.msg)
  818. //校验未通过
  819. if (rs.msg && rs.msg.length > 0) {
  820. result.push(rs)
  821. elem.style.borderBottomColor = 'red';
  822. } else { //通过
  823. this.hideMsgDiv()
  824. // 如果运行到这里证明校验通过
  825. if (elem.oldBorderColor == 'default')
  826. elem.style.borderBottomColor = '';
  827. else
  828. elem.style.borderBottomColor = elem.oldBorderColor;
  829. }
  830. }
  831. }
  832. return result;
  833. },
  834. checkInput: function (targetinput) {
  835. var result = []
  836. // targetinput里存有校验器
  837. if (targetinput.validationInfos) {
  838. var validationInfos = targetinput.validationInfos
  839. for (var i = 0; i < validationInfos.length; i++) {
  840. var elem = targetinput;
  841. var rs = this.check(validationInfos[i], elem);
  842. //校验未通过
  843. if (rs.msg && rs.msg.length > 0) {
  844. result.push(rs)
  845. // elem.style.borderBottomColor='red';
  846. } else { //通过
  847. // this.hideMsgDiv()
  848. // // 如果运行到这里证明校验通过
  849. // if(elem.oldBorderColor=='default')
  850. // elem.style.borderBottomColor='';
  851. // else
  852. // elem.style.borderBottomColor=elem.oldBorderColor;
  853. }
  854. }
  855. }
  856. return result
  857. },
  858. /**
  859. * 对数组中消息进行排序。
  860. */
  861. sortRs: function (a, b) {
  862. if (!a || !b)
  863. return -1;
  864. var typeA = a.type;
  865. var typeB = b.type;
  866. if (typeB == ValidationManager.MSG_TYPE_ERROR) {
  867. return 1;
  868. } else
  869. return -1;
  870. },
  871. /**
  872. * 获取表单元素的名字或ID
  873. */
  874. getNameOrId: function (formElem) {
  875. if (formElem.name)
  876. return formElem.name;
  877. else
  878. return formElem.id;
  879. },
  880. /**
  881. * 为保存到数组rsArr的消息,添加前缀。
  882. */
  883. addMsgPrefix: function (rsArr) {
  884. for (var i = 0; i < rsArr.length; i++) {
  885. var rs = rsArr[i];
  886. var prefix;
  887. if (rs.type == ValidationManager.MSG_TYPE_SUCCESS) {
  888. prefix = '正确:';
  889. } else if (rs.type == ValidationManager.MSG_TYPE_ERROR) {
  890. prefix = '错误:';
  891. } else if (rs.type == ValidationManager.MSG_TYPE_WARNING) {
  892. prefix = '警告:';
  893. }
  894. rs.msg = prefix + rs.msg;
  895. console.log(rs)
  896. }
  897. },
  898. /**
  899. * 检查所有要校验的input元素,并返回校验失败的结果
  900. */
  901. checkAll: function (validationInfos, targetInput) {
  902. var rsArr = []; // 返回的校验结果
  903. var allFormElems = []; // 保存所有要校验的表单元素
  904. var errFormElems = {}; // 所有校验不通过的表单元素
  905. for (var i = 0; i < validationInfos.length; i++) {
  906. // 一个校验信息
  907. var validationInfo = validationInfos[i];
  908. /**
  909. * 校验并获得校验结果 rs.msg = msg; rs.type = type; rs.formElems = formElems;
  910. */
  911. for (var j = 0; j < validationInfo.formElems.length; j++) {
  912. var elem = validationInfo.formElems[j];
  913. var rs = this.check(validationInfo, elem);
  914. // console.log(rs.msg)
  915. //校验未通过
  916. if (rs.msg && rs.msg.length > 0)
  917. rsArr.push(rs)
  918. this.via(elem, rs.msg);
  919. // if (rs.msg && rs.msg.length > 0) {
  920. // rsArr.push(rs)
  921. // elem.style.borderBottomColor = 'red';
  922. // this.checkObjectPicker(elem,rs.msg);
  923. // } else { //通过
  924. //
  925. // // 如果运行到这里证明校验通过
  926. // if (elem.oldBorderColor == 'default')
  927. // elem.style.borderBottomColor = '';
  928. // else
  929. // elem.style.borderBottomColor = elem.oldBorderColor;
  930. //
  931. // this.checkObjectPicker(elem);
  932. // this.hideMsgDiv()
  933. // }
  934. }
  935. }
  936. // 对消息进行排序
  937. // rsArr.sort(this.sortRs);
  938. // 为保存到数组rsArr的消息,添加前缀。
  939. // this.addMsgPrefix(rsArr);
  940. // console.log(rsArr)
  941. return rsArr;
  942. },
  943. /**
  944. * 如果校验通过,返回true
  945. */
  946. passValidation: function (rsArr) {
  947. var rs = true;
  948. if (rsArr && rsArr.length > 0)
  949. rs = false;
  950. return rs;
  951. },
  952. /**
  953. * 实时校验的方法
  954. *
  955. * @param {}
  956. * targetInput目标input元素
  957. */
  958. checkForRealTime: function (targetInput) {
  959. // try{
  960. if (window.event && "focus" == window.event.type) {
  961. // this.MsgDiv.style.top = "-500px"
  962. this.hideMsgDiv();
  963. return;
  964. }
  965. // 获得当前表单元素校验不通过的消息集
  966. var rsArr = this.checkInput(targetInput);
  967. var isnullFunction = false;
  968. // if(targetInput.validationInfos&&targetInput.validationInfos.length==1){
  969. //// console.log(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
  970. // isnullFunction=(targetInput.validationInfos[0].funRef==wd.commonValidator.notNull)
  971. // }
  972. // isnullFunction = !$(targetInput).val() // 去掉,导致鼠标进入时不显示错误信息 -- 不知干啥用???Lin
  973. // console.log(targetInput.validationInfos);
  974. if (window.event) {
  975. if (window.event.type == "keyup")
  976. isnullFunction = false;
  977. }
  978. if (!isnullFunction)
  979. this.setMsg(rsArr); // 设定显示表单验证结果的iframe的显示内容
  980. // console.log(rsArr);
  981. this.via(targetInput, rsArr, isnullFunction);
  982. //console.log(targetInput)
  983. // 校验不通过,显示校验信息
  984. // if (!this.passValidation(rsArr)) {
  985. //// this.checkObjectPicker(targetInput,rsArr);
  986. //// targetInput.style.borderBottomColor = "red"
  987. // this.showMsgDiv(targetInput); // MsgDiv定位于要校验的目标input元素的上方
  988. // } else { // 校验通过
  989. //// this.checkObjectPicker(targetInput);
  990. //
  991. //// if (targetInput.oldBorderColor == 'default') {
  992. //// targetInput.style.borderBottomColor = '';
  993. //// } else {
  994. //// targetInput.style.borderBottomColor = targetInput.oldBorderColor;
  995. //// }
  996. // this.hideMsgDiv(); // 隐藏MsgDiv
  997. // }
  998. return rsArr;
  999. /*
  1000. * }catch(e){ if(this.debug) alert('方法checkForRealTime执行异常:'+e.message); }
  1001. */
  1002. },
  1003. recursionIframe: function (win) {
  1004. if (win.parent == top && win.parent == win) {
  1005. // var xy = this.getAbsPoint(win);
  1006. return {
  1007. "x": 0,
  1008. "y": 0,
  1009. "w": 0,
  1010. "h": 0
  1011. }; ;
  1012. }
  1013. var winPar = win.parent; // .opener
  1014. var iframeArr = winPar.document.getElementsByTagName('IFRAME');
  1015. var targetIframe;
  1016. for (var i = 0; i < iframeArr.length; i++) {
  1017. var iframeElem = iframeArr[i];
  1018. if (iframeElem.contentWindow == win) {
  1019. targetIframe = iframeElem;
  1020. break;
  1021. }
  1022. }
  1023. // alert(targetIframe==null)
  1024. var xy = this.getAbsPoint(targetIframe);
  1025. if (winPar.parent != winPar) {
  1026. var xy2 = this.recursionIframe(winPar);
  1027. xy.x += xy2.x;
  1028. xy.y += xy2.y;
  1029. }
  1030. return xy
  1031. },
  1032. findObjectPickerInputer: function (target) {
  1033. var name = target.getAttribute("name");
  1034. if (!name)
  1035. return;
  1036. var inputer = document.querySelector("[name=" + name + "Name]");
  1037. if (!inputer) {
  1038. inputer = document.querySelector("[name=" + name + "Input]");
  1039. if (!inputer && /id$/.test(name)) {
  1040. var inputName = name.replace(/id$/, "Name");
  1041. inputer = document.querySelector("[name=" + inputName + "]");
  1042. }
  1043. if (!inputer && /m$/.test(name)) {
  1044. var inputName = name.replace(/m$/, "Name");
  1045. inputer = document.querySelector("[name=" + inputName + "]");
  1046. }
  1047. }
  1048. return inputer;
  1049. },
  1050. checkObjectPicker: function (target, msg) {
  1051. var name = target.getAttribute("name");
  1052. var obj = wd.edit.objectPicker.getInstance(name);
  1053. if (!obj)
  1054. return;
  1055. if (msg) {
  1056. obj.failValidation();
  1057. } else {
  1058. obj.passValidation();
  1059. }
  1060. // var inputer=this.findObjectPickerInputer(target);
  1061. // if(!inputer)return;
  1062. // if(msg){
  1063. // inputer.style.border="red 1px solid";
  1064. // }else{
  1065. // inputer.style.border="";
  1066. //
  1067. // }
  1068. },
  1069. via: function (targetInput, msg, isnullFunction) {
  1070. var gh = targetInput.GrowHeight;
  1071. var name = targetInput.getAttribute("name");
  1072. if (gh != null) {
  1073. name = targetInput.GrowHeight.getName();
  1074. }
  1075. if (!name || !wd.edit)
  1076. return;
  1077. var leftSpan = document.getElementById(name + "Span");
  1078. if (!leftSpan) {
  1079. leftSpan = document.createElement("span");
  1080. leftSpan.setAttribute("id", name + "Span");
  1081. // leftSpan.setAttribute("class","validation-span");
  1082. leftSpan.setAttribute("class", "border-input-error vLine-leftWarning");
  1083. // leftSpan.style.borderLeft=" 1px solid red",
  1084. // leftSpan.style.height="100%";
  1085. // leftSpan.style.display= "none";
  1086. // leftSpan.style.position="absolute";
  1087. // leftSpan.style.left="0px";
  1088. }
  1089. if (gh != null) {
  1090. var growHeightElement = gh.getElement();
  1091. growHeightElement.parentNode.insertBefore(leftSpan, growHeightElement);
  1092. } else {
  1093. targetInput.parentNode.insertBefore(leftSpan, targetInput);
  1094. }
  1095. var obj;
  1096. try{
  1097. obj=wd.edit.objectPicker? wd.edit.objectPicker.getInstance(name):null;
  1098. }catch(e){
  1099. console.log(e);
  1100. }
  1101. // console.log(obj)
  1102. // visibility
  1103. if (!this.passValidation(msg)) {
  1104. // this.checkObjectPicker(targetInput,msg);
  1105. // if(!obj)
  1106. leftSpan.style.display = "";
  1107. // targetInput.style.borderColor = "red"
  1108. // this.showMsgDiv(targetInput); // MsgDiv定位于要校验的目标input元素的上方
  1109. if(msg&&msg.length>0&&msg[0].msg){
  1110. if (!isnullFunction) {
  1111. if (obj) {
  1112. this.showMsgDiv(obj.getDisplayElement(),msg[0].msg);
  1113. } else {
  1114. this.showMsgDiv(targetInput,msg[0].msg);
  1115. }
  1116. }
  1117. }
  1118. } else { // 校验通过
  1119. // this.checkObjectPicker(targetInput);
  1120. leftSpan.style.display = "none";
  1121. // targetInput.style.borderColor = '';
  1122. this.hideMsgDiv(); // 隐藏MsgDiv
  1123. }
  1124. },
  1125. mouseoverEvent: function (targetInput, activeFun) {
  1126. var THIS = this;
  1127. var target = targetInput;
  1128. var name = targetInput.getAttribute("name");
  1129. if (name && wd.edit && wd.edit.objectPicker) {
  1130. var obj = wd.edit.objectPicker.getInstance(name);
  1131. if (obj) {
  1132. target = obj.getDisplayElement();
  1133. }
  1134. }
  1135. var f = function () {
  1136. activeFun.call(targetInput);
  1137. }
  1138. $(target).on("mouseenter", f).on("mouseout", function () {
  1139. // console.log(window.event)
  1140. // if(window.event.srcElement!=target)return false
  1141. if ($(target).find(window.event.relatedTarget).length == 1)
  1142. return false;
  1143. // console.log(window.event.srcElement)
  1144. // THIS.MsgDiv.style.top = "-500px"
  1145. THIS.hideMsgDiv();
  1146. })
  1147. // this.addEventListener(target, // 需绑定监听事件的DOM元素
  1148. // 'onmouseenter', // 事件名称,如:onclick
  1149. // f); // 事件触发的回调函数
  1150. }
  1151. };