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

利用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)(一)的更多相关文章

  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. whatweb tree

    . ├── 1.txt ├── addons │   ├── country-scanner │   ├── gggooglescan │   ├── hunter │   └── verify-ni ...

  2. Laravel 5.4 Cache::put的一个小坑

    使用的是Cache的file驱动,然而在\Cache::put($key,$value)时发现,并没有存入. 一开始以为是file驱动的问题,后来跟踪代码发现,居然源码里当过期时间不设置时,根本不保存 ...

  3. java基础篇---异常处理

    认识异常 异常时导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失,所以在程序的设计中必须考虑各种异常的发生,并正确的做好相应的处理,这样才能保证程序 ...

  4. 【WPF】代码触发Button点击事件

    先定义Button按钮并绑定事件. public void test() { Button btn = new Button(); btn.Click += Btn_Click; } private ...

  5. iis7.5 发布mvc出错的解决办法

    发布mvc,配置iis7.5时,遇到这个错误. xxxx'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b ...

  6. android开发(32) android 中 actionbar 常用方法。设置标题,隐藏图标等

    设置标题: actionBar.setTitle("关于我们"); 使返回箭头出现 actionBar.setDisplayHomeAsUpEnabled(true); 监听返回按 ...

  7. rabbitMQ rabbitmq-server -detached rabbitmq-server -detached rabbitmq-server -detached

    [root@localhost mnesia]# cat /etc/rabbitmq/rabbitmq-env.conf RABBITMQ_MNESIA_BASE=/home/rabbitmq/mne ...

  8. springmvc 接受json参数的坑

    构造json数据时候js对象中的值 一定要用 "" 双引号,不能用单引号,因为转成字符串后,到后台进行解析时,因为java认为单引号是单字符 ,转不成对应的字符串,所以会报错! 如 ...

  9. R语言使用tryCatch进行简单的错误处理

    最近在看<机器学习:实用案例解析>,做邮件过滤器的时候,参考书中的代码读取邮件文件进行分类器训练,在读取过程中会出现下面的错误:   seq.default(which(text == & ...

  10. 解决在IE浏览器中JQuery.resize()执行多次的方法(转)

    最近在做前台效果的时候用到了JQuery提供的resize()事件.resize 这个事件是监听浏览器窗口的放大与缩小,也就是说浏览器窗口大小的变化. 我在W3CSCHOOL上面查阅的时候,提供了一个 ...