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 ...
随机推荐
- bootstrap table 自己设置值
在使用bootstrap table的值默认是从 total rows 里面取,可是后台返回的json数据并不是这样的怎么办 可以使用 responseHandler 自定义: $(function ...
- Scala 中的构造器
Scala上的从构造器也有一定的限制,Scala编程中写道. “Scala 里的每一个从构造器的第一个动作都是调用同一个类里面其他的构造器.换句话说 就是,每个 Scala 类里的每个从构造器都是以“ ...
- ubuntu 14.04 gitlab 的搭建
经过两天的尝试,gitlab 终于在 ubuntu14.04 上面搭建起来. 一.安装相关软件. // 执行如下命令: sudo apt-get install vim git curl openss ...
- font-face 跨域解决
nginx 里设置@font-face 跨域 server { ... # Fix @font-face cross-domain restriction in Firefox location ~* ...
- 初学Struts2
1.新建工程,引用Struts2 项目结构如下: 2.Web配置,web.xml: <?xml version="1.0" encoding="UTF-8" ...
- DLL入门
DllTest工程 QMath.h #pragma once #ifdef API_EXPORT #define DLL_CLASS __declspec(dllexport) #define DLL ...
- FormWindowState.Maximized的陷阱
MDI父窗体下面有很多子窗体.子窗体打开时都是以FormWindowState.Maximized的属性打开的,但是结果部分如意,部分奇怪. 先贴上单实例的代码: static TestForm _s ...
- TIDB介绍 新数据库趋势
TIDB是什么? TIDB 受谷歌Spanner和F1的论文启发的new sql数据库,这类数据库不仅具有NoSQL对海量数据的存储管理能力,还保持了传统数据库支持ACID和SQL等特性,同类数据库还 ...
- Java设计模式(19)状态模式(State模式)
State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...
- HTML5规范尘埃落定,5个开发工具推荐
HTML5规范终于在今年正式定稿,对于从事多年HTML5开发的人员来说绝对是一个重大新闻.数字天堂董事长,DCloud CEO王安也发表了文章,从开发者和用户两个角度分析了HTML对两个人群的优势.其 ...