请看下端脚本,我做的一个脚本检测标题是否重复的,若重复,不让其提交。  
函数入口是check()函数,在其else语句中调用了sendRequestTitle();通过sendRequestTitle();
的响应函数processResponseTitle()来根据后台的判断情况修改flag的值,flag是个全局变量,这样写在processResponseTitle()函数里应该可以修改其职的呀,但是结果是修改无效。请高手指点一二。
 <script type="text/javascript">
   var flag=false;//标示标题是否已存在
   <!-- ajax判断标题重复 --> var XMLHttpReq;
  //创建XMLHttpRequest对象       
         function createXMLHttpRequest() {
if(window.XMLHttpRequest) { 
XMLHttpReq = new XMLHttpRequest();
}
else if (window.ActiveXObject) { 
try {
XMLHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
XMLHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
}
//发送请求函数
function sendRequestTitle() {
var title=document.getElementById("title").value; //取得输入的信息标题
//alert(title);
var url="KeyWordNameCheckServlet";  
                  var urlstr="title="+title+"&r=000";
                      createXMLHttpRequest();
    XMLHttpReq.open("POST", url, true); //建立与服务器的连接.
    XMLHttpReq.onreadystatechange = processResponseTitle;//指定响应函数
    XMLHttpReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    XMLHttpReq.send(urlstr);  // 发送请求
}
      / /  响应函数
      function processResponseTitle()
      {
  if (XMLHttpReq.status == 200)
         {
   var response = XMLHttpReq.responseText;
            if(response.substring(0,4)=="true"){
                flag=true;
                alert("该条信息已经存在!");   
                return false;
            }else{
                flag=false;
                return true;
            }

}else
{
alert("您所请求的页面有异常!");
}
  //}
 }
function check()//=====================本次脚本执行的入口===========================
{
title=document.form1.title.value;
    if (title=="")
{
    alert("请输入标题!");
return false;
}
else
{
    sendRequestTitle();
             //alert(flag);//若是不屏蔽掉这条语句,flag在最前面的初始值就能正确显示出来,否则显示不出来,为何?
    if(flag)return false;
    else return true;
}
}</script>

解决方案 »

  1.   

    else
    {
    sendRequestTitle();  //这个是异步的执行顺序 在AJAX还在执行的时候 程序已经执行下面的语句了 这个时候 flag还是初始的flase 不过下面如果有alert(...)的话 alert()会停止执行线程 这个停止的时间AJAX的线程就运行完成了 所以更改下程序的运行顺序 或者 设置AJAX同步调用
      //alert(flag);//若是不屏蔽掉这条语句,flag在最前面的初始值就能正确显示出来,否则显示不出来,为何?
    if(flag)return false;
    else return true;
      

  2.   

    可以加一个判断
    if(flag){
        return false;
    }else{ 
        return true;
    }
      

  3.   

    没必要用到全局变量了
      //alert(flag);//若是不屏蔽掉这条语句,flag在最前面的初始值就能正确显示出来,否则显示不出来,为何?
    if(flag)return false;
    else return true;改成return sendRequestTitle();flag 没变是因为你是用的ajax 是异步  当时结果还没出来  你的js就已经执行到if(flag)return false;了