【问题标题】:Preventing form submission after validation by parsley.js通过 parsley.js 验证后防止表单提交
【发布时间】:2014-11-15 11:59:54
【问题描述】:

我已经多次使用 parsley.js,并且从字面上复制了我上次使用 parsley 的代码。

但是,每次我提交表单时,页面都会刷新。 preventDefault 似乎可以在我的其他页面上工作,并阻止页面刷新,但由于某种原因,当我现在尝试时它不起作用。谁能弄清楚为什么不呢?

<script>
    $(function(){
        $("#register_signup").submit(function(e){
            e.preventDefault();
            var form = $(this);
            if ($('#rform').parsley( 'isValid' )){
                alert('valid');
            }
        });
    });
</script>

<form id='rform' name='rform' data-parsley-validate>
    <input id='reg_password' class='register_input' type='text'  autocomplete="off" data-parsley-trigger="change" placeholder='Password' required>
    <input id='reg_cpassword' class='register_input' type='text' name="reg_cpassword" placeholder='Confirm password' data-parsley-equalto="#reg_password" required>

    <input id='register_signup' type="submit" onClick="javascript:$('#rform').parsley( 'validate' );" value='Sign Up' />
</form>

【问题讨论】:

    标签: javascript parsley.js


    【解决方案1】:

    您将submit 事件绑定到input 元素。如果您检查jquery $.submit() documentation,它会声明:

    当用户尝试提交表单时,提交事件被发送到元素。 只能附加到&lt;form&gt; 元素。可以通过单击明确的&lt;input type="submit"&gt;&lt;input type="image"&gt;&lt;button type="submit"&gt; 来提交表单,或者在某些表单元素具有焦点时按 Enter。

    这是您的主要问题,这就是为什么永远不会显示 alert(事实上,永远不会执行该代码)。

    我也会改变一些事情:

    1. $('#rform').parsley( 'validate' ) 应该是 $('#rform').parsley().validate(),假设您使用的是 Parsley 2。*
    2. $('#rform').parsley( 'isValid' ) 应该是 $('#rform').parsley().isValid()
    3. 使用$.on() 而不是$.submit()
    4. register_signup 元素中删除onClick。由于您已经在使用 javascript,我会直接在 javascript 代码中而不是 onclick 中执行此操作。这更多是个人喜好。

    所以,您的代码将是这样的:

    <form id='rform' name='rform'>
        <input id='reg_password' class='register_input' type='text'  autocomplete="off" 
            data-parsley-trigger="change" placeholder='Password' required>
        <input id='reg_cpassword' class='register_input' type='text' name="reg_cpassword"
             placeholder='Confirm password' data-parsley-equalto="#reg_password" required>
    
        <input id='register_signup' type="submit" value='Sign Up' />
    </form>
    
    <script>
        $(document).ready(function() {
            $("#rform").on('submit', function(e){
                e.preventDefault();
                var form = $(this);
    
                form.parsley().validate();
    
                if (form.parsley().isValid()){
                    alert('valid');
                }
            });
        });
    </script>
    

    【讨论】:

    • 由于您使用 javascript 来验证表单,因此应从表单中删除 'data-parsley-validate' 属性
    • 使用您回答的代码来防止提交但无法正常工作。有什么建议吗?
    • @ankitsuthar,您应该创建一个小提琴并发布一个新问题。
    • 您不想仅在验证失败时触发e.preventDefault() 吗?这样,如果验证成功,则表单将正常提交,或者可能被稍后的事件捕获和处理。
    • @Jason,是的,你是对的,你可以有一个else 语句并将e.preventDefault() 移动到那个else。我保留了代码,因为它是基于问题的,因为我习惯于使用 ajax 提交表单,在这种情况下,应该始终执行 e.preventDefault()
    【解决方案2】:

    如果你使用的是 parsely 2,你可以试试这个

    $(function () {
    //parsely event to validate form -> form:valiate
    $('#rform').parsley().on('form:validate', function (formInstance) {
        //whenValid return promise if success enter then function if failed enter catch
        var ok = formInstance.whenValid()
        //on success validation
        .then(function(){
            alert('v');
            formInstance.reset();
        })
        //on failure validation
        .catch(function(){
            formInstance.destroy();
        });
    
    $('.invalid-form-error-message')
      .html(ok ? '' : 'You must correctly fill *at least one of these two blocks!')
      .toggleClass('filled', !ok);
      // console.log(formInstance);
    if (!ok)
      formInstance.validationResult = false;
      console.log(formInstance);
    });
    
    //parsely event to submit form -> form:submit
    $('#rform').parsley().on('form:submit', function (formInstance) {
    // if you want to prevent submit in any condition after validation success -> return it false
    return false;
    });
    
    //default submit still implemented but replaced with event form:submit
    $('#rform').submit(function () {
      alert('dd');
    });
    });
    

    更多详情parsely documentation查看带有示例和事件的表单

    【讨论】:

      【解决方案3】:

      当您将 data-parsley-validate 应用于表单时,您无需将 javascript 应用于表单以停止提交,直到所有验证运行。 但是,如果您在 parsely() 无效时应用 javascript 返回 false。 并且只要确保你有包含 parsley.js 代码文件。

      【讨论】:

      • 但是为什么要刷新页面呢?
      • 它不刷新,它只是提交您的表单。因为您需要设置标志,如果表单验证完成返回 true 提交表单,如果不返回 false 则提交表单。
      • 你也可以阻止它提交
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多