最近在项目中遇到一个问题,它的需求是:

  1. 利用DWZ的主从表结构批量添加课程信息,需要在触发课程代码文本框的离开事件时验证:
  2. 1、是否选择学院。
  3. 2、数据库里是否已存在该课程代码。
  4. 3、多条数据添加时,界面是否有重复的课程代码。

  第一步→给每行的课程代码文本框添加onblur离开事件。

  主从表代码如下:

  

  1. <table class="list nowrap itemDetail" addButton="添加课程" width="100%"
  2. id="parentTable">
  3. <thead>
  4. <tr>
  5. <th type="code" name="courseList[#index#].code" size="5"
  6. fieldClass="required " fieldAttrs="{maxlength:2}">课程代码</th>
  7. <th type="text" name="courseList[#index#].name" size="20"
  8. defaultVal="" fieldClass="required">课程名称</th>
  9. <th type="enum" name="courseList[#index#].courseType.id"
  10. size="20" fieldClass="required"
  11. enumUrl="${contextPath }/course/showCourseType.do">课程类型</th>
  12. <th type="text" name="courseList[#index#].remark" defaultVal=""
  13. size="30" fieldClass="required ">备注</th>
  14. <th type="del" width="30">操作</th>
  15. </tr>
  16. </thead>
  17. <tbody>
  18. </tbody>
  19. </table>

  主从表效果如下:

  

  一开始尝试在里面直接添加onblur="customFun(this)",但是失败了,结果离开事件只显示在了表头“课程代码”上面。所以,必要时,我们需要修改js,当点击“添加课程”的时候,肯定会添加一行html。所以,将onblur加到对应的html里才是正解。于是追踪到对应的js为:

 

  1. function tdHtml(field) {
  2. var html = '', suffix = '';
  3. if (field.name.endsWith("[#index#]"))
  4. suffix = "[#index#]";
  5. else if (field.name.endsWith("[]"))
  6. suffix = "[]";
  7. var suffixFrag = suffix ? ' suffix="' + suffix + '" '
  8. : '';
  9. var attrFrag = '';
  10. if (field.fieldAttrs) {
  11. var attrs = DWZ.jsonEval(field.fieldAttrs);
  12. for ( var key in attrs) {
  13. attrFrag += key + '="' + attrs[key] + '"';
  14. }
  15. }
  16. switch (field.type) {
  17. case 'del':
  18. html = '<a href="javascript:void(0)" class="btnDel '
  19. + field.fieldClass + '">删除</a>';
  20. break;
  21. case 'lookup':
  22. var suggestFrag = '';
  23. if (field.suggestFields) {
  24. suggestFrag = 'autocomplete="off" lookupGroup="'
  25. + field.lookupGroup
  26. + '"'
  27. + suffixFrag
  28. + ' suggestUrl="'
  29. + field.suggestUrl
  30. + '" suggestFields="'
  31. + field.suggestFields
  32. + '"'
  33. + ' postField="'
  34. + field.postField
  35. + '"';
  36. }
  37. html = '<input type="hidden" name="'
  38. + field.lookupGroup + '.' + field.lookupPk
  39. + suffix + '"/>'
  40. + '<input type="text" name="' + field.name
  41. + '"' + suggestFrag + ' lookupPk="'
  42. + field.lookupPk + '" size="' + field.size
  43. + '" class="' + field.fieldClass + '"/>'
  44. + '<a class="btnLook" href="'
  45. + field.lookupUrl + '" lookupGroup="'
  46. + field.lookupGroup + '" ' + suggestFrag
  47. + ' lookupPk="' + field.lookupPk
  48. + '" title="查找带回">查找带回</a>';
  49. break;
  50. case 'attach':
  51. html = '<input type="hidden" name="'
  52. + field.lookupGroup
  53. + '.'
  54. + field.lookupPk
  55. + suffix
  56. + '"/>'
  57. + '<input type="text" name="'
  58. + field.name
  59. + '" size="'
  60. + field.size
  61. + '" readonly="readonly" class="'
  62. + field.fieldClass
  63. + '"/>'
  64. + '<a class="btnAttach" href="'
  65. + field.lookupUrl
  66. + '" lookupGroup="'
  67. + field.lookupGroup
  68. + '" '
  69. + suggestFrag
  70. + ' lookupPk="'
  71. + field.lookupPk
  72. + '" width="560" height="300" title="查找带回">查找带回</a>';
  73. break;
  74. case 'enum':
  75. $.ajax({
  76. type : "POST",
  77. dataType : "html",
  78. async : false,
  79. url : field.enumUrl,
  80. data : {
  81. inputName : field.name
  82. },
  83. success : function(response) {
  84. html = response;
  85. }
  86. });
  87. break;
  88. case 'date':
  89. html = '<input type="text" name="'
  90. + field.name
  91. + '" value="'
  92. + field.defaultVal
  93. + '" class="date '
  94. + field.fieldClass
  95. + '" dateFmt="'
  96. + field.patternDate
  97. + '" size="'
  98. + field.size
  99. + '"/>'
  100. + '<a class="inputDateButton" href="javascript:void(0)">选择</a>';
  101. break;
  102. case 'code':
  103. html = '<input type="text" onblur="customFun(this)" name="'
  104. + field.name
  105. + '" value="'
  106. + field.defaultVal
  107. + '" size="'
  108. + field.size
  109. + '" class="'
  110. + field.fieldClass + '" ' + attrFrag + '/>';
  111. break;
  112.  
  113. default:
  114. html = '<input type="text" name="'
  115. + field.name
  116. + '" value="'
  117. + field.defaultVal
  118. + '" size="'
  119. + field.size
  120. + '" class="'
  121. + field.fieldClass + '" ' + attrFrag + '/>';
  122. break;
  123. }

  所以,如果(<th type="text" > ) type="text"则会添加一行以下的代码,所以我们将onblur事件添加在下面的<input>标签里就可以实现了。

  1. html = '<input type="text" name="'
  2. + field.name
  3. + '" value="'
  4. + field.defaultVal
  5. + '" size="'
  6. + field.size
  7. + '" class="'
  8. + field.fieldClass + '" ' + attrFrag + '/>';
  9. break;
  1.   为了不影响之前的代码实现,所以我加了一个条件为code的判断如下:onblur事件已经成加入了。
      
  1.                 case 'code':
  2. html = '<input type="text" onblur="customFun(this)" name="'
  3. + field.name
  4. + '" value="'
  5. + field.defaultVal
  6. + '" size="'
  7. + field.size
  8. + '" class="'
  9. + field.fieldClass + '" ' + attrFrag + '/>';
  10. break;
  1.  
  1.  

  测试一下吧,onblur事件已经成功添加了!

  

  1.  

  第二步→判断是否选择学院。

  学院下拉框id="collegeName":

  

  1. <div class="unit">
  2. <label>所属学院名称:</label> <select class="combox" name="collegeId"
  3. id="collegeName">
  4. <option id="all" value="">--请选择学院--</option>
  5. <c:forEach var="item" items="${colleges}">
  6. <option id="${item.institutionId}" value="${item.institutionId}">${item.institutionCode}${item.institutionName}</option>
  7. </c:forEach>
  8. </select>
  9. </div>

  Js判断如下:

  1. <script defer type="text/javascript">
  2.  
  3. //code离开判断学院是否选择,判断数据库是否存在,判断界面是否
  4. function customFun(code) {
  5. //1、测试code列离开事件是否成功
  6. //alert("我的离开事件,第一次弹窗!");
  7. //alertMsg.warn('我的离开事件,第一次弹窗!!');
  8. //——————success——————————
  9. //2、判断是否选择学院
  10. var selectObj = document.getElementById("collegeName");
  11. var activeIndex = selectObj.options[selectObj.selectedIndex].value;
  12. if (activeIndex == ""){
  13. alertMsg.warn('请先选择学院!');
  14. selectObj.focus();
  15. return false;
  16. }
  17. //——————success——————————
  18.  
  19. }
  20. </script>

   第三步→Ajax异步判断是否数据库里已存在此课程代码

  js代码(DRP实例):

  

  1. //3、判断数据库里是否存在此code使用Ajax
  2. if (code.value.length != 0) {
  3. var xmlHttp = null;
  4. //表示当前浏览器不是ie,如ns,firefox
  5. if(window.XMLHttpRequest) {
  6. xmlHttp = new XMLHttpRequest();
  7. } else if (window.ActiveXObject) {
  8. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  9. }
  10. var url = "${contextPath }/course/validateCourseCodeAction.action?collegeId=" +selectObj.value + "&courseCode="+code.value+"&time=" + new Date().getTime();
  11.  
  12. //设置请求方式为GET,设置请求的URL,设置为异步提交
  13. xmlHttp.open("GET", url, true);
  14.  
  15. //将方法地址复制给onreadystatechange属性
  16. //类似于电话号码
  17. xmlHttp.onreadystatechange=function() {
  18. //Ajax引擎状态为成功
  19. if (xmlHttp.readyState == 4) {
  20. //HTTP协议状态为成功
  21. if (xmlHttp.status == 200) {
  22. if (xmlHttp.responseText != "") {
  23.  
  24. alertMsg.warn( "数据库里已存在该课程代码,请勿重复添加");
  25. }
  26.  
  27. }else {
  28. alertMsg.warn("请求失败,错误码=" + xmlHttp.status);
  29.  
  30. }
  31. }
  32. };
  33.  
  34. //将设置信息发送到Ajax引擎
  35. xmlHttp.send(null);
  36. }

  validateCourseCodeAction.action对应的方法:

  

  1. /**
  2. * @MethodName : validateCourseCode
  3. * @Description : 表单唯一性验证
  4. * @param courseCode
  5. * @return
  6. */
  7. public void validateCourseCode() {
  8. System.out.println("巨亚红测试collegeId=" + collegeId);
  9. String collegeId=request.getParameter("collegeId");
  10. // 根据学院ID获得学院Code
  11. String code = courseService.getCollegeById(collegeId).getInstitutionCode();
  12. // 获得课程Code
  13. String courseCode = request.getParameter("courseCode");
  14. // 设置课程code=学院code+课程code
  15. StringBuffer codeBuffer = new StringBuffer();
  16. codeBuffer.append(code);
  17. codeBuffer.append(courseCode);
  18.  
  19. List<Course> courses = courseService.getCourseByCode(codeBuffer.toString());
  20. if (courses.size() > 0) {
  21. outMsg(AjaxObject.newOk("数据库里已存在该课程代码,请勿重复添加!").setNavTabId("courseListview").toString());
  22.  
  23. }
  24.  
  25. }

  实现效果如下:

  

   第四步→判断界面唯一性,获取各行code值(下篇博客来介绍)

  

DWZ主从表界面唯一性验证(自写js)(一)的更多相关文章

  1. DWZ主从表界面唯一性验证(自写js)(二)

    上篇介绍了自写js判断的前三项,本篇博客介绍第四步,关于触发课程代码文本框的离开事件后,判断一整列的课程代码之间是否有重复的值. 此问题可以提取为判断一个数组里是否有重复值,重复值是什么. 第四步→判 ...

  2. DWZ主从表界面唯一性验证(后台验证)(三)

    之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断. 再次介绍一下背景需求: 利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件 1.是 ...

  3. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  4. Winform界面中主从表编辑界面的快速处理

    在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...

  5. Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性

    原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...

  6. Winform开发框架之单据窗体生成(主从表,流水单号)

    源码地址:https://github.com/GarsonZhang/GZFramework.ShareDemo 前言 1.在开始本节前请先重置代码为 chapter-03-start 懒人地址:h ...

  7. Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)

    Asp.Net MVC +EntityFramework主从表新增编辑操作的实现 对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的.我在网上搜索了很久都 ...

  8. DataSnap ClientdataSet 三层中主从表的操作

    非原创  摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...

  9. HTML5表单及其验证

    随笔- 15 文章- 1 评论- 115 HTML5表单及其验证   HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用.HTML5 Forms新增了许多新控件及其A ...

随机推荐

  1. 5. 集成学习(Ensemble Learning)GBDT

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  2. 纯CSS3打造非常炫的加载动画

    纯css3打造的一款非常炫的加载图.用在需要一定时间加载的地方非常合适.先上效果图: 点击这里在线预览 代码非常简单.没有用任何javascript代码.纯css3实现. html代码: <di ...

  3. vue前后分离动态路由和权限管理方案

    需求 需要根据不同的角色来显示不同的菜单 问题 系统是前后分离模式开发的,出现了后端接口和前端路由都需要权限管理. 思路 后端的接口肯定得验证权限 在前端做好组件名和组件的映射 前端的路由通过后端发回 ...

  4. Knockout开发中文API系列4–监控属性数组

    PS:这个翻译系列好久都没有更新了,实在是不应该,一方面是由于时间不多,另一方面也由于自身惰性太大,从今天起接着更新,会在最近的一月内把这个系列中文API文档翻译完整. 如果你想侦测并响应一个对象的变 ...

  5. vim 小技巧

    cd - 返回刚才访问的目录shift+# 在vi中查找相同的关键字vi 中o在当前游标位置后插入一行 O在当前位置前插入一行0 $到行未 行首shift+s 删除一行,并且进入insert mode ...

  6. Linux(Centos7)yum安装最新redis

    正如我们所知的那样,Redis是一个开源的.基于BSD许可证的,基于内存的.键值存储NoSQL数据库.Redis经常被视为一个数据结构服务器,因为Redis支持字符串strings.哈希hashes. ...

  7. drupal7 的核心模块

    核心模块 Drupal 7 block Block(区块)模块提供了与区块相关的功能,通过区块可将内容放置在网站不同区域.Block模块是Drupal的基础模块之一,不能被禁用.它是通过单独的区块管理 ...

  8. sqoop 兼容性问题

    --direct 只支持mysql 5.0 + 和postgresql 8.3+(只是import) jdbc的jar包需要放在$SQOOP_HOME/lib目录下 mysql zeroDateTim ...

  9. 移动端报表JS开发演示样例

    近期对移动端的报表开发颇有研究,细磨精算了好久,尽管到如今还是"囊中羞涩",但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比較有代表性的FineReport. 1. ...

  10. jquery 发get post请求

    https://www.cnblogs.com/summers/p/3225375.html POST 方法不会缓存数据 $.get(URL,callback); 2个参数 callback 参数是请 ...