DWZ主从表界面唯一性验证(自写js)(一)
最近在项目中遇到一个问题,它的需求是:
- 利用DWZ的主从表结构批量添加课程信息,需要在触发课程代码文本框的离开事件时验证:
- 1、是否选择学院。
- 2、数据库里是否已存在该课程代码。
- 3、多条数据添加时,界面是否有重复的课程代码。
第一步→给每行的课程代码文本框添加onblur离开事件。
主从表代码如下:
- <table class="list nowrap itemDetail" addButton="添加课程" width="100%"
- id="parentTable">
- <thead>
- <tr>
- <th type="code" name="courseList[#index#].code" size="5"
- fieldClass="required " fieldAttrs="{maxlength:2}">课程代码</th>
- <th type="text" name="courseList[#index#].name" size="20"
- defaultVal="" fieldClass="required">课程名称</th>
- <th type="enum" name="courseList[#index#].courseType.id"
- size="20" fieldClass="required"
- enumUrl="${contextPath }/course/showCourseType.do">课程类型</th>
- <th type="text" name="courseList[#index#].remark" defaultVal=""
- size="30" fieldClass="required ">备注</th>
- <th type="del" width="30">操作</th>
- </tr>
- </thead>
- <tbody>
- </tbody>
- </table>
主从表效果如下:
一开始尝试在里面直接添加onblur="customFun(this)",但是失败了,结果离开事件只显示在了表头“课程代码”上面。所以,必要时,我们需要修改js,当点击“添加课程”的时候,肯定会添加一行html。所以,将onblur加到对应的html里才是正解。于是追踪到对应的js为:
- function tdHtml(field) {
- var html = '', suffix = '';
- if (field.name.endsWith("[#index#]"))
- suffix = "[#index#]";
- else if (field.name.endsWith("[]"))
- suffix = "[]";
- var suffixFrag = suffix ? ' suffix="' + suffix + '" '
- : '';
- var attrFrag = '';
- if (field.fieldAttrs) {
- var attrs = DWZ.jsonEval(field.fieldAttrs);
- for ( var key in attrs) {
- attrFrag += key + '="' + attrs[key] + '"';
- }
- }
- switch (field.type) {
- case 'del':
- html = '<a href="javascript:void(0)" class="btnDel '
- + field.fieldClass + '">删除</a>';
- break;
- case 'lookup':
- var suggestFrag = '';
- if (field.suggestFields) {
- suggestFrag = 'autocomplete="off" lookupGroup="'
- + field.lookupGroup
- + '"'
- + suffixFrag
- + ' suggestUrl="'
- + field.suggestUrl
- + '" suggestFields="'
- + field.suggestFields
- + '"'
- + ' postField="'
- + field.postField
- + '"';
- }
- html = '<input type="hidden" name="'
- + field.lookupGroup + '.' + field.lookupPk
- + suffix + '"/>'
- + '<input type="text" name="' + field.name
- + '"' + suggestFrag + ' lookupPk="'
- + field.lookupPk + '" size="' + field.size
- + '" class="' + field.fieldClass + '"/>'
- + '<a class="btnLook" href="'
- + field.lookupUrl + '" lookupGroup="'
- + field.lookupGroup + '" ' + suggestFrag
- + ' lookupPk="' + field.lookupPk
- + '" title="查找带回">查找带回</a>';
- break;
- case 'attach':
- html = '<input type="hidden" name="'
- + field.lookupGroup
- + '.'
- + field.lookupPk
- + suffix
- + '"/>'
- + '<input type="text" name="'
- + field.name
- + '" size="'
- + field.size
- + '" readonly="readonly" class="'
- + field.fieldClass
- + '"/>'
- + '<a class="btnAttach" href="'
- + field.lookupUrl
- + '" lookupGroup="'
- + field.lookupGroup
- + '" '
- + suggestFrag
- + ' lookupPk="'
- + field.lookupPk
- + '" width="560" height="300" title="查找带回">查找带回</a>';
- break;
- case 'enum':
- $.ajax({
- type : "POST",
- dataType : "html",
- async : false,
- url : field.enumUrl,
- data : {
- inputName : field.name
- },
- success : function(response) {
- html = response;
- }
- });
- break;
- case 'date':
- html = '<input type="text" name="'
- + field.name
- + '" value="'
- + field.defaultVal
- + '" class="date '
- + field.fieldClass
- + '" dateFmt="'
- + field.patternDate
- + '" size="'
- + field.size
- + '"/>'
- + '<a class="inputDateButton" href="javascript:void(0)">选择</a>';
- break;
- case 'code':
- html = '<input type="text" onblur="customFun(this)" name="'
- + field.name
- + '" value="'
- + field.defaultVal
- + '" size="'
- + field.size
- + '" class="'
- + field.fieldClass + '" ' + attrFrag + '/>';
- break;
- default:
- html = '<input type="text" name="'
- + field.name
- + '" value="'
- + field.defaultVal
- + '" size="'
- + field.size
- + '" class="'
- + field.fieldClass + '" ' + attrFrag + '/>';
- break;
- }
所以,如果(<th type="text" > ) type="text"则会添加一行以下的代码,所以我们将onblur事件添加在下面的<input>标签里就可以实现了。
- html = '<input type="text" name="'
- + field.name
- + '" value="'
- + field.defaultVal
- + '" size="'
- + field.size
- + '" class="'
- + field.fieldClass + '" ' + attrFrag + '/>';
- break;
- 为了不影响之前的代码实现,所以我加了一个条件为code的判断如下:onblur事件已经成加入了。
- case 'code':
- html = '<input type="text" onblur="customFun(this)" name="'
- + field.name
- + '" value="'
- + field.defaultVal
- + '" size="'
- + field.size
- + '" class="'
- + field.fieldClass + '" ' + attrFrag + '/>';
- break;
测试一下吧,onblur事件已经成功添加了!
第二步→判断是否选择学院。
学院下拉框id="collegeName":
- <div class="unit">
- <label>所属学院名称:</label> <select class="combox" name="collegeId"
- id="collegeName">
- <option id="all" value="">--请选择学院--</option>
- <c:forEach var="item" items="${colleges}">
- <option id="${item.institutionId}" value="${item.institutionId}">${item.institutionCode}${item.institutionName}</option>
- </c:forEach>
- </select>
- </div>
Js判断如下:
- <script defer type="text/javascript">
- //code离开判断学院是否选择,判断数据库是否存在,判断界面是否
- function customFun(code) {
- //1、测试code列离开事件是否成功
- //alert("我的离开事件,第一次弹窗!");
- //alertMsg.warn('我的离开事件,第一次弹窗!!');
- //——————success——————————
- //2、判断是否选择学院
- var selectObj = document.getElementById("collegeName");
- var activeIndex = selectObj.options[selectObj.selectedIndex].value;
- if (activeIndex == ""){
- alertMsg.warn('请先选择学院!');
- selectObj.focus();
- return false;
- }
- //——————success——————————
- }
- </script>
第三步→Ajax异步判断是否数据库里已存在此课程代码
js代码(DRP实例):
- //3、判断数据库里是否存在此code使用Ajax
- if (code.value.length != 0) {
- var xmlHttp = null;
- //表示当前浏览器不是ie,如ns,firefox
- if(window.XMLHttpRequest) {
- xmlHttp = new XMLHttpRequest();
- } else if (window.ActiveXObject) {
- xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
- }
- var url = "${contextPath }/course/validateCourseCodeAction.action?collegeId=" +selectObj.value + "&courseCode="+code.value+"&time=" + new Date().getTime();
- //设置请求方式为GET,设置请求的URL,设置为异步提交
- xmlHttp.open("GET", url, true);
- //将方法地址复制给onreadystatechange属性
- //类似于电话号码
- xmlHttp.onreadystatechange=function() {
- //Ajax引擎状态为成功
- if (xmlHttp.readyState == 4) {
- //HTTP协议状态为成功
- if (xmlHttp.status == 200) {
- if (xmlHttp.responseText != "") {
- alertMsg.warn( "数据库里已存在该课程代码,请勿重复添加");
- }
- }else {
- alertMsg.warn("请求失败,错误码=" + xmlHttp.status);
- }
- }
- };
- //将设置信息发送到Ajax引擎
- xmlHttp.send(null);
- }
validateCourseCodeAction.action对应的方法:
- /**
- * @MethodName : validateCourseCode
- * @Description : 表单唯一性验证
- * @param courseCode
- * @return
- */
- public void validateCourseCode() {
- System.out.println("巨亚红测试collegeId=" + collegeId);
- String collegeId=request.getParameter("collegeId");
- // 根据学院ID获得学院Code
- String code = courseService.getCollegeById(collegeId).getInstitutionCode();
- // 获得课程Code
- String courseCode = request.getParameter("courseCode");
- // 设置课程code=学院code+课程code
- StringBuffer codeBuffer = new StringBuffer();
- codeBuffer.append(code);
- codeBuffer.append(courseCode);
- List<Course> courses = courseService.getCourseByCode(codeBuffer.toString());
- if (courses.size() > 0) {
- outMsg(AjaxObject.newOk("数据库里已存在该课程代码,请勿重复添加!").setNavTabId("courseListview").toString());
- }
- }
实现效果如下:
第四步→判断界面唯一性,获取各行code值(下篇博客来介绍)
DWZ主从表界面唯一性验证(自写js)(一)的更多相关文章
- DWZ主从表界面唯一性验证(自写js)(二)
上篇介绍了自写js判断的前三项,本篇博客介绍第四步,关于触发课程代码文本框的离开事件后,判断一整列的课程代码之间是否有重复的值. 此问题可以提取为判断一个数组里是否有重复值,重复值是什么. 第四步→判 ...
- DWZ主从表界面唯一性验证(后台验证)(三)
之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断. 再次介绍一下背景需求: 利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件 1.是 ...
- 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...
- Winform界面中主从表编辑界面的快速处理
在Winform开发中,我们往往除了常规的单表信息录入外,有时候设计到多个主从表的数据显示.编辑等界面,单表的信息一般就是控件和对象实体一一对应,然后调用API保存即可,主从表就需要另外特殊处理,本随 ...
- Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性
原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...
- Winform开发框架之单据窗体生成(主从表,流水单号)
源码地址:https://github.com/GarsonZhang/GZFramework.ShareDemo 前言 1.在开始本节前请先重置代码为 chapter-03-start 懒人地址:h ...
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
Asp.Net MVC +EntityFramework主从表新增编辑操作的实现 对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的.我在网上搜索了很久都 ...
- DataSnap ClientdataSet 三层中主从表的操作
非原创 摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...
- HTML5表单及其验证
随笔- 15 文章- 1 评论- 115 HTML5表单及其验证 HTML表单一直都是Web的核心技术之一,有了它我们才能在Web上进行各种各样的应用.HTML5 Forms新增了许多新控件及其A ...
随机推荐
- 5. 集成学习(Ensemble Learning)GBDT
1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...
- 纯CSS3打造非常炫的加载动画
纯css3打造的一款非常炫的加载图.用在需要一定时间加载的地方非常合适.先上效果图: 点击这里在线预览 代码非常简单.没有用任何javascript代码.纯css3实现. html代码: <di ...
- vue前后分离动态路由和权限管理方案
需求 需要根据不同的角色来显示不同的菜单 问题 系统是前后分离模式开发的,出现了后端接口和前端路由都需要权限管理. 思路 后端的接口肯定得验证权限 在前端做好组件名和组件的映射 前端的路由通过后端发回 ...
- Knockout开发中文API系列4–监控属性数组
PS:这个翻译系列好久都没有更新了,实在是不应该,一方面是由于时间不多,另一方面也由于自身惰性太大,从今天起接着更新,会在最近的一月内把这个系列中文API文档翻译完整. 如果你想侦测并响应一个对象的变 ...
- vim 小技巧
cd - 返回刚才访问的目录shift+# 在vi中查找相同的关键字vi 中o在当前游标位置后插入一行 O在当前位置前插入一行0 $到行未 行首shift+s 删除一行,并且进入insert mode ...
- Linux(Centos7)yum安装最新redis
正如我们所知的那样,Redis是一个开源的.基于BSD许可证的,基于内存的.键值存储NoSQL数据库.Redis经常被视为一个数据结构服务器,因为Redis支持字符串strings.哈希hashes. ...
- drupal7 的核心模块
核心模块 Drupal 7 block Block(区块)模块提供了与区块相关的功能,通过区块可将内容放置在网站不同区域.Block模块是Drupal的基础模块之一,不能被禁用.它是通过单独的区块管理 ...
- sqoop 兼容性问题
--direct 只支持mysql 5.0 + 和postgresql 8.3+(只是import) jdbc的jar包需要放在$SQOOP_HOME/lib目录下 mysql zeroDateTim ...
- 移动端报表JS开发演示样例
近期对移动端的报表开发颇有研究,细磨精算了好久,尽管到如今还是"囊中羞涩",但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比較有代表性的FineReport. 1. ...
- jquery 发get post请求
https://www.cnblogs.com/summers/p/3225375.html POST 方法不会缓存数据 $.get(URL,callback); 2个参数 callback 参数是请 ...