情况是这样的,我想修改一条数据,数据包括“名字”和“描述”这两个字段。
其中名字必须是唯一的。
我的做法是在名字的onchange事件中 进行ajax的验证。
也就是说,当我改完名字,再点其他位置时,
就会很快的验证出 改后的名字是否唯一的结果。
如果是唯一 就无提示
如果该名字已存在就提示“名字已存在”并且reset这个表单。上述都是正常情况。但是!!如果我改完名字,马上点“提交”!
就会直接修改数据,此时ajax还没来得及响应完。
所以就会出现重名的现象。我也试过加flag来控制是否已通过ajax验证了 已通过的话才能提交
可是 如果我只改“描述”不改“名字”的话 就不需要ajax验证
那flag也无法解决了。。
所以现在很矛盾。。不知道改怎么解决了
网上搜索半天了 也没搜索到相关解决方案。。
55555 (T_T) 俺在这里静候佳音了。下面是主要代码:<script language="javascript">
function check(){
var Form = document.getElementById("edit-department");
var dname = document.getElementById("deptName").value;
var desc = document.getElementById("desc").value;
if(!checkIsNotEmpty(dname)||!checkIsNotEmpty(desc)){
 alert("Asterisk * indicates required fields!");
 return false;  
}else 
 Form.submit();
}function getdeptNameCount(deptName) {
  if(checkNull(deptName)){
   document.getElementById("update").disabled = true; 
var ajaxImg = document.getElementById("ajaxLoaderImg");
   ajaxImg.style.display = "";
   http_request = get_request();
   var url="";
   http_request.onreadystatechange = processCheckAgentRequest;
   url="<%=request.getContextPath()%>/taskmanage/edit-department.action";
   http_request.open("POST", url, true);
   http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   http_request.send("action=getdeptNameCount&deptName=" + deptName);
   document.getElementById("update").disabled = false;
}
}
function processCheckAgentRequest() {
var Form = document.getElementById("edit-department");
  if (http_request.readyState == 4) {
    if (http_request.status == 200) { 
      var resText = http_request.responseText;
      var ajaxImg = document.getElementById("ajaxLoaderImg");
      ajaxImg.style.display = "none";
     if (resText == "exist") {
        alert("This name is already exist! Now, the data will be reset.");
        Form.reset();        
      }
      }
    } else {
       alert("ERROR: status is " + http_request.status);
    }
  }  
</script><s:form namespace="/taskmanage" action="edit-department" theme="simple">
<s:hidden name="action" value="update" />
<s:hidden name="updDepartment.id" />
<s:textfield label="" name="updDepartment.deptName"
required="true" id="deptName"
onchange="getdeptNameCount(this.value)" cssClass="inputline"
size="20" /><img id="ajaxLoaderImg" style="display: none"
src="<%=request.getContextPath()%>/images/ajax-loader.gif"><s:textarea name="updDepartment.deptDesc" id="desc" cols="36" rows="3" /><input id="update" type="button" value="Update"
class="textfield" onClick="check()" />

解决方案 »

  1.   

    这就是我之前做过的设置flag的方法
    可是我可能不修改名字 不需要验证 只改描述 然后就提交啊
      

  2.   

    1 无论何时,数据库里面保证唯一是根本,所以那个字段加上唯一键是必须的。
    2 提交时客户端,onsubmit时,调用验证的js方法
    3 提交到服务器端,用程序再次检测是否重复,如果没有则提交。其实,第一条永远是根本,没有2和3,同样可以保证系统完整性。
    2和3是提高用户的体验。
      

  3.   

    我原来想的是 无论数据库里是否设置唯一
    如果提交的数据是唯一的就没问题我是想在提交之前就判断出数据的正确性
    这不也是ajax的的特点所在吗如果是提交以后判唯一性 然后再返回个actionError
    那也就体现不出来ajax的便捷了
      

  4.   

    我验证唯一是 onchange事件时才会去访问数据库看是否有重复
    是查count(name)是否大于1
    如果像你说的这样做 那我传的值得再加上当前的id了
    否则 名字不改的话也会被看做是重名了 因为数据库里有这条数据本身555555...大改啊。。如果能让客户改完名字不马上点提交就不用这么大改动了。。郁闷。。
      

  5.   

    对了 我还试过 设置timeout 延迟几秒钟再提交
    好让ajax验证先进行完
    可是。。好像不起作用 55555