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 ...
随机推荐
- Asp.net 从客户端中检测到有潜在危险的Request.Form值
解决方法: 在Web.config文件里找到<httpRuntime>节点,然后修改requestValidationMode="2.0" 修改结果如下: <sy ...
- js之获取url中"?"后面的字串
url : index.php?id=123 <script type="text/javascript"> function GetRequest() { var u ...
- 【Visual Studio】项目的引用显示黄色叹号
情况一:个别引用的DLL显示黄色叹号. 通常是因为该DLL需要的.Net Framework版本与当前项目使用的版本不兼容.如该DLL需要的版本高于当前项目使用的版本.考虑修改项目的.Net Fram ...
- WPF委托命令DelegateCommand的传参方式
首先引用 Microsoft.Practices.Prism MVVM模式代码如下: XAML代码: <!-- 无参方式 --> <Button Content="Tes ...
- C语言 · 求arccos值
算法提高 7-2求arccos值 时间限制:10.0s 内存限制:256.0MB 问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[- ...
- JVM相关命题的博客整理及总结
JVM垃圾回收基础介绍 http://www.jianshu.com/p/57457a351b8a 减少JVM中逃逸对象的使用 http://www.importnew.com/23150.html ...
- 如何在Linux下Redis安装
转载出于:http://blog.csdn.net/jiangguilong2000/article/details/8114740 redis作为NoSQL数据库的一种应用,响应速度和命中率上还是比 ...
- 如何修改被hosts.deny禁止访问的IP
自己的密码忘记了,重试了很多次被加入了黑名单. 如果仅仅清空 /etc/hosts.deny 文件内容,你会发现过一会自己的IP又进入里面了. 其实系统后台会定期自动扫描一些文件,然后将这些异常的IP ...
- hbase1.4.0安装和使用
jia下载地址: http://mirrors.shuosc.org/apache/hbase/1.4.0/ 解压 tar -zxvf hbase-1.4.0-bin.tar.gz 修改环境变量 [ ...
- node学习笔记5——post数据传递
上一篇有讲到get数据的传递.有了上一篇的了解,今天讲下如何获取到post传递过来的数据. 通过post传送的数据,在node里面主要是通过req.on('data',function (data) ...