【问题标题】:return false doesn't prevent form submissionreturn false 不会阻止表单提交
【发布时间】:2013-11-30 13:59:38
【问题描述】:

我有一个表单,我正在尝试对其进行一些验证,以捕获旧浏览器和 Safari(!)上的必填字段。到目前为止,我的解决方案似乎几乎工作......当我在 Safari 上提交带有空字段的表单时,会弹出错误,然后无论如何都会提交表单。我做错了什么?

我的表单如下所示:

<form id="primaryPostForm" method="POST" >

<input type="text" name="iName" id="iID" maxlength="25" required="required" value="" />

<textarea class="tipContent requiredAttr" name="taName" id="taID" maxlength="150" required="required" ></textarea> 

<input type="hidden" name="submitted" id="submitted" value="true" />
<input id="submitBtn" type="submit" value="Submit">

我的验证如下所示:

function validate(){
$('#primaryPostForm').submit(function(){
    $("#primaryPostForm .requiredAttr").each(function(){
        if($(this).val().length < 1){
        alert("Please make sure the fields are filled in - thanks");
        return false;}
    })//end each
})//end submit
}

【问题讨论】:

  • 你只在内部函数中返回,事件监听器没有返回任何值。

标签: javascript jquery forms


【解决方案1】:

return false 仅退出 each 循环。您需要存储一个可以从函数返回的结果:

function validate(){
  $('#primaryPostForm').submit(function(){
    var result = true;
    $("#primaryPostForm .requiredAttr").each(function(){
        if($(this).val().length < 1){
        alert("Please make sure the fields are filled in - thanks");
        result = false;
        return false; // exit loop
      }
    })//end each
    return result;
  })//end submit
}

【讨论】:

  • 为什么投反对票?如果你不解释你认为错的地方是什么,它就无法改进答案。
【解决方案2】:

首先,使用e.preventDefault(); 而不是return false。

回答您的问题: return false 必须在提交事件回调的范围内:

function validate(){
    $('#primaryPostForm').submit(function(e){
        var ret = true;
        $("#primaryPostForm .requiredAttr").each(function(){
            if($(this).val().length < 1){
                alert("Please make sure the fields are filled in - thanks");
                ret = false;    
            }
        });
        if(!ret){
            e.preventDefault();
        }
    });
}

更简洁直接的方法是:

$('#primaryPostForm').submit(function(e){
    var required = $(".requiredAttr", this).filter(function(){
        return !this.value;
    });
    if(required.length){
        alert("Please make sure the fields are filled in - thanks");
        e.preventDefault();
    }
});

【讨论】:

  • 如果您使用的是e.preventDefault(),那么在您的第一个版本中,您可以将其直接放在.each() 中,而不是使用ret 变量。并将return false 保留在.each() 中,否则您可能会收到多个警报...
  • 你是对的!我很着急,没有太在意
【解决方案3】:

试试这个,参考MDN

function validate(){
$('#primaryPostForm').submit(function(){
    var result = [];
    $("#primaryPostForm .requiredAttr").each(function(){
        if($(this).val().length < 1){
        result.push(false);
        }
    })//end each
    result.some(function(element){return (element!=false)})
    alert("Please make sure the fields are filled in - thanks");
})//end submit
}

【讨论】:

  • 无论字段值如何,这都会显示警报,并且不会阻止表单提交。 (当你的.each() 循环之后需要if (result.length&gt;0) 时,你为什么要使用.some()?)
猜你喜欢
  • 2014-04-22
  • 2013-03-07
  • 1970-01-01
  • 2012-02-02
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多