一个文本框,在输入ID后,触发onblue事件取出对应的名称显示在后面,可是如果输入ID后直接点击提交按钮,这时会先走submit再触发onblue,导致到下一个页面只接到了ID没有取到对应的名称.
这个貌似可以用判断名称是否为空再提交表单实现,但如果是很复杂的页面就比较麻烦了,有没有简单的一点的解决办法呢.
各位JS高手们,帮忙想想呗,谢谢啦!!!!!

解决方案 »

  1.   

    吧按钮的type改为button,
    在onclick事件里面提交请求form.submit();
      

  2.   

    把submit改成button
    在button的onclick的function方法里做判断
      

  3.   

    页面初始化的时候,按钮是disable,当触发ID事件后,把按钮状态修改成可点击状态。
      

  4.   

    用onchange()事件取代onblur()事件,即可!
      

  5.   

    注意onchange()事件会在提交动作之前被触发,而onblur事件会被提交动作吃掉!
      

  6.   

    点击按钮表单提交了,没有触发失去焦点事件的function.
    在<form  onSubmit="return xx();"  //xx()是你失去焦触发的function
      

  7.   

    function fcprocMain(psProc,..,..,..) {
    switch(psProc) {
    case "blur": // onblur
                fconBlurAction(..,..,..,..,..);
    break;
    ...
    "next": // 表单提交
        document.frmMain.submit();
    break;
    default:
    }
    }
    // 下面的IMART标签也许有人知道,是小日本基于struts开发的框架
    <IMART type="imIcon"  name="下一页"  icon="images/standard/new.gif"
           href="javascript:fcprocMain('next','','','','','','');"> 
    </IMART>
    。。
    <!--ID1-->
    <IMART type="zsInput" style="text" name="txtID1"
       ...onblur="javascript:fcprocMain('blur','..','..','..','..','..');">
    </IMART>
    <!--名称1-->
    <IMART type="zsInput" style="text" name="txtName1"..></IMART>
    还有若干个ID和名称的文本框会发生onblur。
    在触发onblur时,会传当前发生onblur的ID,通过ajaix实现取到对应此ID的名称。
    不知道我说明白没有。赫赫  
      

  8.   

    如果是若干文本框触发onblur,会传不同值,这样用你这个办法就没办法知道到底是哪个ID文本框触发的onblur事件,对吧。。
      

  9.   

    onblur="javascript:fcprocMain('blur','查询的表名','检索条件(即当前触发onblur的ID)','返回时显示在哪个控件上','查询字段');">
    在触发onblur时会传一些参数,到ajax页通过传的条件检索名称,并将结果返回显示在页面相应的控件上。
      

  10.   

    楼主认为使用onblur比onchange更合适吗?
      

  11.   

    现在是用这俩个提交到下一页面都取不到。对我现在做的东西,用onblur和onchange都可以,对业务没影响。
      

  12.   

    应该不会,我已在服务器端用ASP进行过测试是可以的,以下是我测试的代码:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
        <title>SubmitTest</title>
        <script type="text/javascript">
            function TextChange()
            {
                var Text1=document.getElementById("Text1");
                if(Text1!=null)
                {
                    var Hidden1=document.getElementById("Hidden1");
                    if(Hidden1!=null)
                    {
                        Hidden1.value=Text1.value;
                    }
                }
            }
        </script>
    </head>
    <body>
        <form action="" id="form1" name="form1" method="post">
            <input id="Text1" name="Text1" type="text" onchange="TextChange();" />
            <input id="Submit1" name="Submit1" type="submit" value="submit" />
            <input id="Hidden1" name="Hidden1" type="hidden" />
        </form>
        <span id="span1"><%=Request.Form("Hidden1") %></span>
    </body>
    </html>
      

  13.   

    我点击Submit1后,服务器端可以读取到Hidden1的值!
    楼主不妨再试试,或许是脚本代码有误!
      

  14.   


    case "change": // onchange
                 fconBlurAction(..,..,..,..,..);
    ......
    <IMART type="zsInput" style="text" name="txtID1"
        ...onchange="javascript:fcprocMain('change','..','..','..','..','..');">
      </IMART>
      

  15.   

    你这样肯定能取到的,我的是提交到ajax页,在ajax页通过查询数据库取得name值,因为执行ajax是慢于表单提交的,所以导致提交到下一页取的还是onblur(或onchange)之前的name值。
      

  16.   


    case "change": // onchange
                 fconBlurAction(..,..,..,..,..);
    ......
    <IMART type="zsInput" style="text" name="txtID1"
        ...onchange="javascript:fcprocMain('change','..','..','..','..','..');">
      </IMART>
      

  17.   


    case "change": // onchange
                 fconBlurAction(..,..,..,..,..);
    ......
    <IMART type="zsInput" style="text" name="txtID1"
        ...onchange="javascript:fcprocMain('change','..','..','..','..','..');">
      </IMART>
      

  18.   

    你这样肯定能取到的,我的是提交到ajax页,在ajax页通过查询数据库取得name值,因为执行ajax是慢于表单提交的,所以导致提交到下一页取的还是onblur(或onchange)之前的name值。
      

  19.   


    case "change": // onchange
                 fconBlurAction(..,..,..,..,..);
    ......
    <IMART type="zsInput" style="text" name="txtID1"
        ...onchange="javascript:fcprocMain('change','..','..','..','..','..');">
      </IMART>
      

  20.   

    你这样肯定能取到的,我的是提交到ajax页,在ajax页通过查询数据库取得name值,因为执行ajax是慢于表单提交的,所以导致提交到下一页取的还是onblur(或onchange)之前的name值。
      

  21.   


    case "change": // onchange
                 fconBlurAction(..,..,..,..,..);
    ......
    <IMART type="zsInput" style="text" name="txtID1"
        ...onchange="javascript:fcprocMain('change','..','..','..','..','..');">
      </IMART>
      

  22.   


    明白,你的意思是改成onchange,我已经试过了,和onblur是一个效果的。
    现在的问题似乎不是onchange和onblur的问题,而是ajax提交要慢于表单提交的问题,无论是onchange还是onblur都是在表单提交成功后才被执行的。
      

  23.   


    汗,网速太慢,连续提交多次!你是怎样提交到Ajax页的?在何时提交,点击Submit提交到Ajax页还是onblur(或onchange)时提交?
    感觉楼主应该是在焦点离开文本框时,提交至Ajax页,如果是这样,可以在onchange事件中,灰化提交按钮,等到获取name值后,再恢复提交按钮,这样就可确保每次在获取name值后在提交表单!
      

  24.   

    是在onblur(或onchange)时提交到Ajax页的。
    除了上面你说的这个方法,还有没有其他解决方法呢,因为如果这样改就和原有系统其他页面不符,原有系统是没有灰化按钮这个需求的。
      

  25.   

    原有系统也存在这个问题,直接点按钮到下一页取不到值。
    现在用户还没有发现这个问题,可能大家都习惯输入后鼠标点一下页面在点按钮吧。
    但这始终是个潜在的问题。
    前面你说的用按钮灰选来控制,这个我觉得好像不可行,你的意思是如果发生了离开焦点事件在点按钮时就让它灰选不可用是吧,在点击按钮时你怎样获取当前发生了离开焦点事件呢,现在是一点击按钮时就马上触发submit事件了。
      

  26.   


    什么意思?你可以在onchange事件的方法中这样分3步写:
    1.灰化提交按钮
    2.获取name值
    3.如果取得了name值,就恢复提交按钮这样做有什么问题吗?
      

  27.   

    嗯,可以,但是如果是复杂的页面触发onchange的控件很多的话,判断是否获取NAME值就很麻烦了。
    我现在解决的方法是,在点提交按钮时会在提交到下一画面前在后台调用验证方法,这个方法里会check你输入的ID在数据库里是否存在,存在才能进入到下一画面,不存在会提示错误信息,所以我就在存在的判断里取出NAME值赋给画面的NAME文本框,这样在提交到下一画面就能够取到对应的NAME值了。