【问题标题】:Mixing formValidation plugin with another function将 formValidation 插件与另一个函数混合
【发布时间】:2017-11-27 04:28:56
【问题描述】:

我使用formValidation 插件来验证我的表单,并且我正在尝试使用 jQuery 构建一个向导。这是我的第一个表格:

<div id="dynamicContent">
<form id="myForm1" method="post" class="form-horizontal" autocomplete="off">
    <div class="form-group">
        <input type="text" name="name" class="form-control" placeholder="First name">
        </div>
    </div>
    <div class="form-group">
        <input type="text" name="surname" class="form-control" placeholder="Last name">
        </div>
    </div>
    <button type="submit" class="btn btn-success btn-sm"> Proceed to step 2 </button>
</form>
</div>  

(我正在尝试控制 dynamicContent div 的内容)

这是第一步的JS sn-p:

    $(document).ready(function() {
    $('#myForm1').formValidation({
        framework: 'bootstrap',
        icon: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
            name: {
                validators: {
                    notEmpty: {
                        message: 'Please specify user first name.'
                    }
                }
            },
            surname: {
                validators: {
                    notEmpty: {
                        message: 'Please specify user last name.'
                    }
                }
            }
        }
    })
    .on('success.form.fv', function(e) {
        // Prevent form submission
        e.preventDefault();

        var $form = $(e.target),
            fv    = $form.data('formValidation');

        // Use Ajax to submit form data
        $.ajax({
            url: 'step2.php',
            type: 'POST',
            data: $form.serialize(),
            success: function(result) {
                $('#dynamicContent').html(result);
            }
        });
    });
});

此代码按预期工作。现在这是第二步文件:

PHP(html 文件):

<?php 
echo "Welcome, ".$_POST["name"]." ".$_POST["surname"];
?>
<form id="myForm2" method="post" class="form-horizontal" autocomplete="off">
    <div class="form-group">
        <input type="text" name="address" class="form-control" placeholder="Address">
        </div>
    </div>
    <div class="form-group">
        <input type="text" name="city" class="form-control" placeholder="City">
        </div>
    </div>
    <div class="form-group">
        <input type="text" name="province" class="form-control" placeholder="Province">
        </div>
    </div>
    <div class="form-group">
        <input type="text" name="postalcode" class="form-control" placeholder="Postal code">
        </div>
    </div>
    <button type="submit" class="btn btn-success btn-sm"> Proceed to step 3 </button>
</form>

这是第二步的js文件:

    $(document).ready(function() {
    $('#myForm2').formValidation({
        framework: 'bootstrap',
        icon: {
            valid: 'glyphicon glyphicon-ok',
            invalid: 'glyphicon glyphicon-remove',
            validating: 'glyphicon glyphicon-refresh'
        },
        fields: {
            address: {
                validators: {
                    notEmpty: {
                        message: 'Please specify address.'
                    }
                }
            },
            city: {
                validators: {
                    notEmpty: {
                        message: 'Please specify city.'
                    }
                }
            },
            province: {
                validators: {
                    notEmpty: {
                        message: 'Please specify province.'
                    }
                }
            },
            postalcode: {
                validators: {
                    notEmpty: {
                        message: 'Please specify postal code.'
                    }
                }
            }
        }
    })
    .on('success.form.fv', function(e) {
        // Prevent form submission
        e.preventDefault();

        var $form = $(e.target),
            fv    = $form.data('formValidation');

        // Use Ajax to submit form data
        $.ajax({
            url: 'step3.php',
            type: 'POST',
            data: $form.serialize(),
            success: function(result) {
                $('#dynamicContent').html(result);
            }
        });
    });
});

但是当我尝试点击Proceed to step 3按钮时,什么都不会发生。甚至没有错误!

我试图改变按钮的行为,以及 JS。如果我将按钮从 submit 更改为普通按钮删除表单验证部分,Ajax 将工作。

<input type="button" onclick="sendForm();" class="btn btn-success btn-sm" value="Send it this way">
function sendForm()
{
    $.ajax({
        url: 'step3.php',
        type: 'POST',
        data: $form.serialize(),
        success: function(result) {
            $('#dynamicContent').html(result);
        }
    });
}

我不在乎是否将按钮从提交更改为普通输入类型,但表单验证很重要。我怎样才能让它工作?

【问题讨论】:

  • form myForm2是js加载完成后创建的,所以不能像以前那样直接使用。
  • @AparajitPUtpat:但是为什么第二个 JS 可以工作?如果我删除表单验证部分,我可以访问表单元素并使用 ajax 发送它。事实上,这里唯一的问题是无法使用表单验证。

标签: javascript jquery html ajax


【解决方案1】:

我认为您的问题是您没有为第二页运行 JavaScript。 Ajax 完成后不会触发第二个就绪事件,因此您需要有一种方法来注册您的插件而不依赖于$(doucment).ready。尝试使用:

$(document).ajaxComplete(function() {
$('#myForm2').formValidation({
    framework: 'bootstrap',
...

请注意,它不在通过您的网站加载的 .js 文件中,因为 每次 ajax 调用完成时都会调用它。更好的方法可能是将您的初始化放入一个函数(非匿名函数)并从插件的success: 回调中调用它,从而链接该过程。

【讨论】:

  • 感谢您的评论。关于 $(document).ready,你是对的,我认为我应该将表单验证部分放在 sendForm() 函数中。你能帮我做吗?如何在 sendForm() 函数中查询表单验证?
  • 如果您有要调用的匿名函数,只需删除代码并将其声明为其他地方的函数,然后将其传入。在您的情况下,创建一个 setupForm() 函数或初始化的东西您的第二个表单并从您的 ajax 成功回调中调用它
猜你喜欢
  • 2012-03-23
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多