无法提交已启用阻止默认值的表单

Unable to submit form with prevent default enabled

我有一段代码要在实际提交表单之前执行。我有 ajax 调用,之后根据结果,必须提交表单,但这是行不通的。

    <form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
    <input type="text" name="username" id="username" value="test" />
    <input type="submit" name="submit" id="submit" value="Save" />
    </form>

    <script>
    $(document).on("submit", '#myform', function(event)
{
    event.preventDefault();
    var form    = $(this);
    $.ajax({
        url: "url",
        type: 'POST',
        success: function (response) 
        {
            if(response    ==  1)
            {
                form.submit();
            }
            else
            {
                return false;
            }
        }
    });
});
    </script>
<form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="text" name="username" id="username" value="test" />
<input type="submit" name="submit" id="submit" value="Save" />
</form>

<script>
$('#myform').on('submit', function (event) 
{
  event.preventDefault();
   var form    = $(this);
   $.ajax({
    url: 'url',
    type: 'POST',
    success: function (response) 
    {
        if(response   ==  1)
        {
            form.submit();
        }
        else
        {
            // response will be valid and the ajax will be complete here
        }
    }
  });
});

事件应该 运行 在 ajax 被调用之前

你的代码应该是这样的:

<script>
$('#submit').on('click', function (event) 
{
    event.preventDefault();
    var form    = $("#myform");
    $.ajax({
        url: 'url',
        type: 'POST',
        success: function (response) 
        {
            if(response   ==  1)
            {
                form.submit();
            }                
        }
    });
    return false;
});
</script>

或者您可以使用

$( "#myform" ).submit(function( event ) {

你应该这样做

<script>
$('#myform').submit(function(event) {
    event.preventDefault();

    var form    = $(this);
    $.ajax({
        url: 'url',
        type: 'POST',
        success: function (response) 
        {
            if(response   ==  1)
            {
                form.submit();
            }
            else
            {

                return false;
            }
        }
    });
});
</script>

也许您应该 运行 喜欢这段代码,其中 e.preventDefault() 首先调用

<form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="text" name="username" id="username" value="test" />
<input type="submit" name="submit" id="submit" value="Save" />
</form>

<script>
$('#myform').on('click', function (event) 
{
e.preventDefault();
var form    = $(this);
$.ajax({
    url: 'url',
    type: 'POST',
    success: function (response) 
    {
        if(response   ==  1)
        {
            form.submit();
        }
        else
        {
            return false;
        }
    }
});
});
 </script>

Ajaxreturns成功后,取消注册提交事件处理程序以避免递归调用并手动触发提交事件(更改提交按钮的id和名称以便不"hide"提交事件)

<form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="text" name="username" id="username" value="test" />
<input type="submit" name="submitBtn" id="submitBtn" value="Save" />
</form>

<script>
$('#myform').on('submit', function (event) 
{
    event.preventDefault();
    var form = $(this);
    $.ajax({
        url: 'url',
        type: 'POST',
        data: form.serialize(),
        success: function(response) 
        {
            if (response ==  1)
            {
                form.off('submit');
                form.trigger('submit');
            }
        }
    });
});
 </script>

我不太确定你真的想用这个实现什么

if(response   ==  1)
            {
                form.submit();
            }
            else
            {
                e.preventDefault();
                return false;
            }

完全没有意义,因为你没有真正回应上面的评论,所以很难理解你想要什么。

我不确定您是否有某种验证,如果您可以使用 jQuery Validation Plugin 在前端进行验证,然后在服务器端使用服务器端进行验证。

而且你没有向服务器端发送任何数据。

您的脚本应该是这样的:

<form id="myform" method="post" action="">
<input type="text" name="username" id="username" value="test" />
<input type="submit" name="submit" id="submit" value="Save" />
</form>

<script>
$('#myform').on('submit', function (event) 
{
    event.preventDefault();
    var formdata    = $('#myform').serialize();
    $.ajax({
        url: 'url',
        type: 'POST',
        data : formdata,
        dataType : 'json',
        encode : true,
        success: function (response) 
        {
            if(response   ==  "What you expected")
            {
               // DO something else
            }
            else
            {
                // Write the error back to the user in some div
            }
        }
    });
});
</script>

编辑:如果你想在提交前进行验证,你可以使用我上面提到的库,你可以这样做

<script  src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>

<form id="myform" method="post" action="">
<input type="text" name="username" id="username" />
<input type="submit" name="submit" id="submit" value="Save" />
</form>

<script>

$('#myform').validate({

    rules :{

        username :{

            required : true,
        }
    },

    messages :{

        username : {

            required : "Enter username",
        }
    },

    submitHandler : sendData

});

function sendData(){

    var formdata    = $('#myform').serialize();
     $.ajax({
        url: 'url',
        type: 'POST',
        data : formdata,
        dataType : 'json',
        encode : true,
        success: function (response) 
        {
            if(response   ==  "What you expected")
            {
               // DO something else
            }
            else
            {
                // Write the error back to the user in some div
            }
        }
    });


    return false; //prevent form traditional submission    
}
</script>

也不要忘记在服务器端进行验证

更多编辑

你说你想发送请求并再次发送的原因是因为你想检查会话是否存在,你可以在向用户显示表单之前执行此操作,如果会话存在则显示表格或显示错误或其他内容

这就是你将如何做到的。

<script  src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/jquery.validation/1.16.0/jquery.validate.min.js"></script>


<?php

    if(isset($_SESSION['name']) && !empty($_SESSION['name'])){?>

        <form id="myform" method="post" action="">
            <input type="text" name="username" id="username" />
            <input type="submit" name="submit" id="submit" value="Save" />
        </form>

            <script>

            $('#myform').validate({

                rules :{

                    username :{

                        required : true,
                    }
                },

                messages :{

                    username : {

                        required : "Enter username",
                    }
                },

                submitHandler : sendData

            });

            function sendData(){

                var formdata    = $('#myform').serialize();
                 $.ajax({
                    url: 'url',
                    type: 'POST',
                    data : formdata,
                    dataType : 'json',
                    encode : true,
                    success: function (response) 
                    {
                        if(response   ==  "What you expected")
                        {
                           // DO something else
                        }
                        else
                        {
                            // Write the error back to the user in some div
                        }
                    }
                });


                return false;    
            }
            </script>
<?php

    }else{

        // the session is not set then do nothing or show error/redirect
    }
?>

然后在您的服务器端,您还需要在接受和处理用户输入之前检查是否存在相同的会话。

<?php
    session_start();

    if(isset($_SESSION['name']) && !empty($_SESSION['name'])){


        //DO FORM PROCCESSING
    }else{

        echo json_encode('not set');

        // send not set back to the client and do something about that response.
    }
?>

我在项目中使用的代码下面也有相同的情况。

<form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
<input type="text" name="username" id="username" value="test" />
<input type="submit" name="submit" id="submit" value="Save" />
</form>
<script>
$('#myform').submit(function(){
    $.ajax({
        url: 'url',
        type: 'POST',
        success: function (response) 
        {
            if(response   ==  1)
            {
                $("#myform")[0].submit();
            }
        }
    });
    return false;
});
</script>

我自己找到了这个问题的答案。

确保您没有将 "submit" 作为属性值的 "NAME" 属性。

下面是代码片段,它运行得非常好。

<form id="myform" method="post" action="<?=$_SERVER['PHP_SELF']?>">
    <input type="text" name="username" id="username" value="test" />
    <input type="submit" name="submitForm" id="submit" value="Save" />
</form>

<script>
$(document).on("submit", '#myform', function(event)
{
    event.preventDefault();
    var form    = $(this);
    $.ajax({
        url: "<?=PATH_SITE?>actions/qa/qaActions.php?act=checkSessionExist",
        type: 'POST',
        success: function (response) 
        {
            if(response    ==  1)
            {
                form.trigger('submit');
                return true;
            }
            else
            {
                return false;
            }
        }
    });
});