如图,小弟想要实现当我点击发送手机验证码的时候,先判断图形验证码,正确的话点击确定按钮就可以触发发送手机验证码,错误的话就不能触发发手机验证码,(现在如图出现的问题,当我点击发送手机验证码按钮的时候,能判断验证码,但同时也发送了手机验证码(这不是我想要的效果)。)第一次发帖,不懂规则,有错的地方请谅解谢谢!

解决方案 »

  1.   

      
    <script type="text/javascript">
    //发送验证码
            function yanzheng() {            var phone = $("#uname").val(); //手机用户
                var myreg = /^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
                var upass = $("#upass").val(); //左边是本地页面的名称,右边是文本框的名称
                var kapmap = $("#kapmap").val(); 
                var schoolAdress = $.trim($("#xuexiao").val());
                if (!myreg.test(phone)) {
                    alert('请输入有效的手机号码!');
                    $("#uname").focus();
                    return false;
                }
                else if (upass == "") {
                    alert("请设置密码!");
                    $("#upass").focus(); 
                }
                else if (schoolAdress == "") {
                    alert("请搜索你的学校!");
                    $("#xuexiao").focus();
                }
                else if (kapmap == "") {
                    alert("请输入验证码!");
                    $("#kapmap").focus();
                }            else {
                    jiaoyan()
                    fun(); //多少秒重发 
                    yanzhengma();
                    var ma = $("#ma").val(); //随机生成手机验证码  
                    //地址栏
                    var friend = unescape(window.location.search).split("^")[1];
                    $.post("ashx/yangzhengma.ashx", { phone: phone, ma: ma, friend: friend }, function (msg) {
                        if (msg == "rest") {
                            alert("该手机号已注册,请重新输入手机号!");
                        }
                        if (msg == "feifa") {
                            alert("您的邀请好友注册链接失败,请重新获取");
                            window.location.href = 'member.aspx';
                        }
                        if (msg == "chaochu") {
                            alert("很抱歉,您发送手机验证码已经超过3次,注册失败,有问题请咨询校园一元购客服:0773-3560936");                    }                });
                }        }        function jiaoyan(returnval) {
                var kapmap = $("#kapmap").val();            if (kapmap == "") {
                    alert("验证码不能为空!");
                    $("#kapmap").focus();
                    return false;
                }
                $.post("yanzhengma/jiaoyanma.ashx", { kapmap: kapmap }, function (msg) {
                    if (msg == "ok") {
                        window.location.href = 'ceshi.aspx'
                    }
                    else if (msg == "no") {
                        alert("验证码错误或者已经过期!");
                        return returnval;
                    }            });        }
            var timer = null;
            var i = 60;
            function fun() {
                $("#show").attr("disabled", "true"); //按扭禁用
                $("#show").attr("value", i + "秒后可重发");
                timer = setInterval("show()", 1000); //设置定时器,1000ms调用一次show()
            }        function show() {
                i--;
                if (i == 0) {
                    $("#show").attr("disabled", null); //还原按扭
                    $("#show").attr("value", "发送验证码");
                    i = 60;
                    clearInterval(timer); //清除定时器
                } else {
                    $("#show").attr("value", i + "秒后可重发"); //数字变化
                }
            }
            function yanzhengma() {
                var ma = "";
                for (var y = 0; y < 6; y++) {
                    ma = ma + Math.floor(Math.random() * 10);
                }
                $("#ma").val(ma);
            }    </script>
      

  2.   


    你的 jiaoyan 函数,它只要一执行,立刻就返回值了。然后才会执行 yanzhengma/jiaoyanma.ashx。所以你写的 return returnval 语句毫无意义。我不知道你的 javascript 是何时、在哪里学的。这里的技术点就是“回调”。你的 jiaoyan 函数要设计为回调形式,也就是function jiaoyao(callback)
    {
        .................
        $.ajax(......., function(msg)
                             {
                                 if(成功)
                                         callback(true);
                                 else
                                         callback(false);
                            });
    ...........这样的逻辑形式。那么你的 yanzheng 函数中也不能写
                    jiaoyan()
                    fun(); //多少秒重发 
                    yanzhengma();
                    ..................
    而应该写成类似
                    jiaoyan(function(yesno)
                    {
                                if(yesno)
                                {
                                       fun(); //多少秒重发 
                                       yanzhengma();
                                       ......................
                                }
                     });这种回调形式。也就是说,你的流程应该分为“两阶段”地异步执行,而不能是顺序的流程。当jiaoyan 函数没有回调,那么yanzheng的第一阶段就结束了;直到jiaoyan 的回调被调起,并且仅当验证通过时,yanzheng的第二阶段函数才被执行。因此 yanzheng 流程要分为两个阶段,从细节着手编写程序流程,绝非在一个函数中顺序完成。
      

  3.   

    这是一个非常基础的程序设计问题。如果不搞懂这个,你就无法设计和调试对外交互的程序。凡是交互式程序(也就是说不能任性地阻塞当前进程/线程)的程序,都是两阶段回调方式的流程。你用一支笔、一张纸,把这个程序的流程图画出来。如果你画成一个顺序操作,其中“等待jiaoyanma.ashx 返回值”画成了流程图中的一个“处理方法”,那么你就应该找教你编程的老师要回学费了。因为他白教你了。凡是交互式操作,那么第二阶段(回调被调起)是另一个流程的开始,这时候可能接着前一个流程未完成的事业继续处理。但是跟上一个流程绝非是顺序的。
      

  4.   


    其实你贴代码太多了,大部分比较了解编程的人不爱看一大篇代码的问题,而爱在论坛上看一大篇代码的人又可能不能回答你的问题。所以,既然你自己发现是“函数返回值问题”,那就说明你有一些意识到流程问题,那就仔细、反复调试,不要把“几天”时间浪费在无意义的思考上,你只要动手调试就会发现 jiaoyan 函数总是在实际调用对应的  ashx 文件之前就执行完毕、执行到  fun() 代码了。贴出你的调试信息,让人准确地看到你关注点在这里,就能有效地沟通。反之如果贴出一大篇代码,那就跟某些博客似地了,看似一大堆相互转抄来的、把别人文章拼凑成“自己的博客”的高大上的文章,而实际上有效果的文章很少。