9

有谁知道如何提交多个功能?我打算做的是:onsubmit 检查所有这些函数是否都返回 true,如果它们都返回 true,那么我执行 action="checked.html"

<form id="myForm" name="myForm" action="checked.html" method="post"
onsubmit="return validateName() || validatePhone() || validateAddress() ||
validateEmail()">

然而,实际发生的是,计算机从左到右检查代码,下一个函数的结果将替换前一个函数的结果,以此类推,直到结束。因此,即使所有 3 个第一个函数都返回 false,只要最后一个函数为 true,计算机将执行 action="checked.html",这不是我打算做的......谁能帮帮我这个,我花了 4 个小时来修复它:S 谢谢!

另外,当我尝试做类似的事情时<form onsubmit="return verify1() && verify2()">,它不起作用,它所做的只是检查verify1(),而不是以下那些...... :(

澄清:在提交时,我想要调用四个验证函数。除非所有四个函数都返回 true,否则应阻止提交,但即使其中一些函数返回 false,也应始终调用所有四个函数。

4

7 回答 7

21

使用&而不是&&.

&&使用短路评估,因此如果左侧操作数为假,则不评估右侧操作数。

&总是计算两个操作数。

onsubmit="return !!(validateName() & validatePhone()
                      & validateAddress() & validateEmail());"

编辑:对不起,我忘了这&不会返回一个实际的布尔值。将表达式括在括号中并使用双!精度将其转换为(现在)所示。(如果在测试中使用结果,您不必担心if,但事件处理程序的返回值应该是一个实际的布尔值。)

PS:这是一个相当笨拙的演示,显示所有四个函数都被调用,但会产生您需要的整体真或假结果:http: //jsfiddle.net/nnnnnn/svM4h/1/

于 2012-08-04T06:20:46.693 回答
7

更改您的代码以使用 AND 而不是 OR

onsubmit="return validateName() && validatePhone() && validateAddress() && validateEmail()"

原因是如果您使用 OR 一旦第一个函数返回 true javascript 就不会费心检查其他函数。此外,您不想使用 OR,因为如果第一次检查为假而第二次检查为真,则表单仍将提交,因为您的至少一项检查为 TRUE。

请参阅fiddle以显示此作品,两个检查都执行并显示警报消息,但由于 check2 返回 false 表单不提交 - 如果您想玩转 checks1 和 check2 函数的返回结果以及 && 和 || 的使用

更好理解问题后,需要使用单个&,但是因为true & true返回1而不是true需要这样写

onsubmit="return ((validateName() & validatePhone() & validateAddress() & validateEmail()) == 1)"

于 2012-08-04T05:44:21.860 回答
3

如果您只需要确保所有函数在继续之前返回 true,则使用&&not|| 并确保表达式不会被返回函数提前评估,请放置一些额外的括号

<form id="myForm" name="myForm" action="checked.html" method="post"
onsubmit="return (validateName() && validatePhone() && validateAddress() &&
validateEmail() )">
于 2012-08-04T05:44:44.077 回答
2

创建一个包装函数,它调用每个函数并检查它们的返回值。在任何时候,如果返回值为 false,您可以通过此时返回 false 来停止表单提交,或者评估其余内容并最终返回 false。

所以 JS 一个可以做你想做的事情的代码是:

function validateForm() {
    var isFormValid = true;
    isFormValid &= validateName();
    isFormValid &= validatePhone();
    isFormValid &= validateAddress();
    isFormValid &= validateEmail();
    return isFormValid? true:false;
}

现在在表格中简单地使用:

<form id="myForm" name="myForm" action="checked.html" method="post" onsubmit="return validateForm();">

这是一个有效的 JSFiddle 示例。

编辑:在下面做了一个嘘声,更正了。

使用 OR 是不正确的,但 AND 无法按预期工作的原因是Short-circuit_evaluation

  • OR : 评估在第一个为真的操作数上停止并返回真
  • AND : 评估在第一个为 false 的操作数处停止并返回 false
  • 于 2012-08-04T06:05:30.597 回答
    0

    onsubmit="return validateName() && validatePhone() && validateAddress() && validateEmail()"

    使用此代码

    于 2014-05-09T11:24:53.860 回答
    0

    为了验证我的表单,我简单地创建了一个名为 validateForm(){} 的函数,然后在这个函数中我放置了完全验证所需的所有代码。然后使用 onsubmit="validateForm()"。它按顺序检查它,只有在所有条件都为真时才提交。

    于 2014-12-18T05:17:31.937 回答
    0

    以下方法检查第一个 validateName() 函数,如果只有第一个函数为真,它将处理检查下一个函数,同样要触发第三个函数需要返回第一个和第二个函数的 true。所以想象一下,如果所有函数都无效,即使你有不同的错误消息,你也只会看到第一个函数的错误消息。一旦 validateName() 函数通过,您可能会看到 validatePhone() 等错误消息。

    <form id="myForm" name="myForm" action="checked.html" method="post"
    onsubmit="return (validateName() && validatePhone() && validateAddress() &&
    validateEmail() )">
    

    如果您要在首次提交时根据上述所有验证显示错误消息,则不能使用上述方法,如果您想在提交时触发所有功能(或显示所有验证错误),则可以使用以下方法。

    <form id="myForm" name="myForm" action="checked.html" method="post"
    onsubmit=" if( ( validateName() && validatePhone() && validateAddress() &&
    validateEmail() ) == false) { return false; } ">
    
    于 2017-07-19T10:16:53.343 回答