【问题标题】:how to submit form after ajax response of submitting another form?如何在提交另一个表单的ajax响应后提交表单?
【发布时间】:2014-09-28 09:52:24
【问题描述】:

我有一个作为文件输入的表单:

<form method="post" id='careerform' action="<?php echo Yii::app()->createUrl('site/career'); ?>" enctype="multipart/form-data">
   <input type="file" name="cv" id="cv">
   <input type="button" id="submitcareer" class="btn btn-default pull-right" data-toggle="modal" data-target=".bs-example-modal-sm" value="Submit">
</form>

当用户点击提交时,表单将被检查验证:

<script type="text/javascript">

    $(document).ready(function() {

$('#careerform').bootstrapValidator({

        feedbackIcons: {

            valid: 'glyphicon glyphicon-ok',

            invalid: 'glyphicon glyphicon-remove',

            validating: 'glyphicon glyphicon-refresh'

        }, 

        fields: {

    cv: {

        validators: {

            notEmpty: {

                message: 'CV is required.'

            },

            file: {

                extension: 'doc,docx,pdf,zip,rtf',

                type: 'application/pdf,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/rtf,application/zip',

                maxSize: 5 * 1024 * 1024,

                message: 'The selected file is not valid, it should be (doc,docx,pdf,zip,rtf) and 5 MB at maximum.'

            },

        }

        }
    }
    }); 
$('#submitcareer').click(function(){      

                $('#careerform').data('bootstrapValidator').validate();     

                if($("#careerform").data('bootstrapValidator').isValid()){
            $('#modalbtn').click();         

                }        

                }); 

});
    </script>

然后会出现一个模态,该模态包含一个包含 google recaptcha 输入的表单:

                <div class="modal-body">
<form method="post" id="modalform" enctype="multipart/form-data">
                        <?php                       

                            require_once(Yii::app()->basePath.'/extensions/recaptchalib.php');

                            $publickey = "...";

                            echo recaptcha_get_html($publickey);

                        ?>                      

                        <button type="submit" class="btn btn-primary" id="modalsubmit" >Submit</button>                 

                    </form>                   

                </div>

                <div class="modal-footer">

                    <script type="text/javascript">         

                        $(document).ready(function() {                                  

                                $("#modalsubmit").click(function(event){ 
                                    event.preventDefault();
                                    $.ajax({
                                        type:"post",
                                        url:"<?php echo Yii::app()->createUrl('site/verify'); ?>",
                                        data:$("#modalform").serialize(),
                                        dataType: 'json',
                                        async: false,
                                        success:function(response){

                                            if(response == 2){

                                                    $('#careerform').data('bootstrapValidator').validate();
                                                        if($("#careerform").data('bootstrapValidator').isValid()){      
                                                            $('#careerform').submit();
                                                        }

                                            }

                                        }
                                    });
                                });

                        });

                    </script>

                </div> 

如果用户正确输入验证码,则 ajax 响应将为 2,则应提交第一个表单。

当我得到响应值 = 2 时,我的问题是第一个表单没有提交,那么这里的问题是什么?还有另一种方法可以做我想做的事吗?

【问题讨论】:

  • 对于初学者来说,如果可以通过禁用 JS 来绕过 reCaptcha,那么它的意义何在?
  • $('#submitcareer').click(function() { 更改为 $('#submitcareer').click(function(e){ e.preventDefault();
  • @mplungjan 结果相同
  • @IbrahimAshShohail 没有响应结果,表单不会被发送到服务器,所以如果你绕过它,什么都不会发生
  • 服务器的响应是什么?

标签: javascript php jquery ajax forms


【解决方案1】:

确定响应类型。如果 dataType 设置为 JSON,jQuery 会尝试将响应转换为 JSON 对象。

【讨论】:

  • 我不是这个意思。试试 console.log(typeof response)。如果它是对象,那么它不能包含 2 作为值。服务器响应是什么?
  • 只需尝试以下操作作为响应来检查这是否是客户端问题: echo json_encode(array('type' => 2));然后在你的回调函数中检查 response.type。
  • 不检查类型,只检查 response.type 中的内容(预期 -> 2)。对于您的代码: if(response.type == 2) { ....
  • 那么如果表单仍然没有提交,那就是客户端行为的问题。查看验证器代码以确定问题所在
  • 验证过程在验证码表单之前被调用,验证中一切正常,但表单仍然没有提交