【问题标题】:Why does this form get submitted even if the required fields are left empty?为什么即使必填字段为空,此表单也会被提交?
【发布时间】:2013-06-14 05:53:00
【问题描述】:

我正在使用一种表单,在该表单中我从用户那里获取密码输入,然后 javascript 检查密码是否匹配。但是即使需要密码,如果输入框为空,表单也会被提交。我正在使用 javascript 提交表单。虽然我有解决问题的方法,但我想问为什么会这样,而不是Please fill in this field 的正常操作,这样做时通常会出现。

HTML-

<form action="check.php" method="POST" id="userform">
USERNAME:<input name="uname" type="text" required/>
PASSWORD:<input type="password" id="upass" name="upass" type="text" required/>
RETYPE PASSWORD:<input type="password" id="reupass" name="reupass" type="text" required/>
<input type="button" value="Submit" onclick="passCheck()">
</form>

JavaScript-

function passCheck(){
var pass1 = document.getElementById('upass').value;
var pass2 = document.getElementById('reupass').value;
if(pass1 == pass2){
    document.getElementById('userform').submit();
}
else{
    alert("Both password inputs do not match. Please retry.");
    document.getElementById('userform').reset();
}
}

编辑- 我希望当我单击按钮并且密码字段留空时应该出现这个:http://i.stack.imgur.com/cGuCK.jpg

【问题讨论】:

  • 不要把监听器放在提交按钮上,把它放在表单的提交处理程序上。可以通过多种方式提交表单,而无需单击提交按钮。此外,您可以将表单引用为document.forms.userform。最后,不能因为用户犯错就重置表单,让他们自己修复吧。
  • 此外,您仍需要验证服务器端的值。您不能依赖 JavaScript 验证,因为它可以被关闭或从浏览器外部发送表单值。

标签: javascript html


【解决方案1】:

因为为了不提交表单,您的函数必须返回 false,并检查以确保密码不为空,例如:http://jsfiddle.net/upgradellc/Heay3/5/

javascript:

function passCheck(){
    var pass1 = document.getElementById('upass').value;
    var pass2 = document.getElementById('reupass').value;
    if(pass1 == pass2 && pass1 != ""){
        return true;
    }
    else{
        alert("Both password inputs do not match. Please retry.");
        document.getElementById('userform').reset();
        return false;
    }
}

html:

<form action="check.php" method="POST" id="userform" onSubmit="return passCheck()" >
    USERNAME:<input name="uname" type="text" />
    PASSWORD:<input type="password" id="upass" name="upass" type="text" />
    RETYPE PASSWORD:<input type="password" id="reupass" name="reupass" type="text" />
    <input type="submit" value="Submit" >
</form>

【讨论】:

  • 请解释一下。不使用 document.getElementById('userform').submit(); 与单击提交按钮相同
  • @Sid 我已经更新了我的答案。 Submit() 确实与单击提交按钮相同-但除非您的 onclick 函数返回 false,否则表单仍将提交 :-)
  • @Max,你不需要返回 false。我在没有返回的情况下进行了测试,效果很好
  • @RishiDua 不,你需要在 onSubmit 事件的情况下返回 false
  • ... 我的也是,使用推荐的表单的 onSumbit 事件,这比使用按钮和调用 submit() 简单得多
【解决方案2】:

那是因为如果两者都是空白

pass1 = NULL pass2 = NULL

本质上意味着pass1 == pass2

[编辑] 将您的代码更改为

function passCheck(){
var pass1 = document.getElementById('upass').value;
var pass2 = document.getElementById('reupass').value;
if((pass1 == pass2) && (pass1!="")){
    document.getElementById('userform').submit();
}
else{
    alert("Both password inputs do not match. Please retry.");
    document.getElementById('userform').reset();
}
}

【讨论】:

  • 但是当您使用 html 提交表单时不会发生这种情况
  • 这里当我们使用 JavaScript 时,两个变量是相等的,即使它们为空。很抱歉我没明白你说的使用 html 提交表单是什么意思?
  • 我的意思是:&lt;input type="submit" value="Submit"&gt;
  • 这是因为 required 标记仅适用于 html 提交选项。由于您使用 document.getElementById('userform').submit() 手动提交,因此您需要检查密码字段是否为空。
  • 但我希望该标签出现
【解决方案3】:

如果密码不匹配不想提交表单,则必须返回 false

这样做:- return false

if(pass1!='' && pass2!='')
 {

    if(pass1 == pass2){
            document.getElementById('userform').submit();
        }
        else{
            alert("Both password inputs do not match. Please retry.");
            document.getElementById('userform').reset();
            return false;
        }

}

还有

您必须将您的 input type="button" 更改为 input type="submit"

编辑:-

您还必须先检查您的密码字段是否为空,如果为空则显示错误并返回 false

【讨论】:

  • 如果我将 input type="button" 更改为 input type="submit" 那么我将无法验证密码输入是否匹配并且表单将被提交
  • @Sid 是的,你可以看看我的回答。
  • 是的,如果您在密码不匹配时返回 false 并且如果密码匹配然后它会自动提交你的表单,因为你没有做 return false
【解决方案4】:

Here is working JsFiddle Demo。试试这个代码:

if(pass1 !="" && pass1 != pass2){
    alert("Both password inputs do not match. Please retry.");
    document.getElementById('userform').reset();
    return false;
}
else{
   document.getElementById('userform').submit();
}

编辑

如果您将输入类型更改为submit,它将自动检查空约束,您仍然可以验证字段

Here is Demo with type SUBMIT

【讨论】:

  • 但是如果两个密码字段都为空,那么pass1==pass2也为真,表单将被提交
  • pass1 != "" 会处理它
  • 我认为 OP 正在使用type="button"
  • type="submit" 按钮将不会在此处独立于任何条件提交表单,因为您已使用 onclick="passCheck()" 覆盖了该操作
  • 如果你不返回 false,默认操作在 passCheck() 之后发生
【解决方案5】:

你需要

<form action="check.php" method="POST" id="userform" onsubmit="return validate()" >
    USERNAME:<input name="uname" id="uname" type="text" required />
    PASSWORD:<input type="password" id="upass" name="upass" type="text" required />
    RETYPE PASSWORD:<input type="password" id="reupass" name="reupass" type="text" required />
    <input type="submit" value="Submit" />
</form>

function validate(){
    var pass1 = document.getElementById('upass').value;
    var pass2 = document.getElementById('reupass').value;
    var username= document.getElementById('uname').value;
    if(username == ""){
        alert('user name cannot be empty')
        return false
    }

    if(pass1 == ""){
        alert('password cannot be empty')
        return false
    }

    if(pass1 != pass2){
        alert("Both password inputs do not match. Please retry.");
        return false;
    }

    return true
}

演示:Fiddle

【讨论】:

  • type="button" 不会提交表单。
  • 这行得通,如果字段为空,我也可以看到Please fill in this field 提示。谢谢
  • @Sid,如果您不想对提交按钮做任何事情,为什么要使用 onclick="passCheck()"?我给了你 JavaScript 解决方案,假设 passCheck() 有更多的代码行(为了简单起见,你在这里删除了一些其他目的)
猜你喜欢
  • 2015-04-30
  • 1970-01-01
  • 2020-09-23
  • 2013-06-29
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2017-08-15
  • 2016-03-31
相关资源
最近更新 更多