提交多个javascript函数

时间:2012-08-04 05:40:43

标签: javascript forms function onsubmit

有谁知道如何提交多个功能?我打算做的是: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个小时我试图解决它:谢谢!

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

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

7 个答案:

答案 0 :(得分:20)

使用&代替&&

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

&总是评估两个操作数。

onsubmit="return !!(validateName() & validatePhone()
                      & validateAddress() & validateEmail());"
编辑:抱歉,我忘了&不会返回实际的布尔值。将表达式包装在括号中并使用双!将其转换为(现在)显示。 (如果在if测试中使用结果,则无需担心,但事件处理程序的返回值应该是实际的布尔值。)

P.S。:这是一个相当笨重的演示,表明所有四个函数都被调用但产生了你需要的整体真假结果:http://jsfiddle.net/nnnnnn/svM4h/1/

答案 1 :(得分:7)

将您的代码更改为使用AND代替OR

  

onsubmit =“return validateName()&amp;&amp; validatePhone()&amp;&amp; validateAddress()&amp;&amp; validateEmail()”

原因是如果你使用OR,那么第一个函数返回true javascript将不会费心去检查其他函数。此外,您不想使用OR,因为如果第一次检查为false且第二次检查为true,则表单仍将提交,因为至少有一项检查为TRUE。

请参阅fiddle以显示此工作,两个检查都执行并显示警告消息,但因为check2返回false,表单不提交 - 如果您想要使用checks1和check2函数的返回结果并且使用&amp;&amp;和||

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

  

onsubmit =“return((validateName()&amp; validatePhone()&amp; validateAddress()&amp; validateEmail())== 1)”

答案 2 :(得分:3)

如果你需要的是确保所有函数在继续之前都返回true,那么使用&&而不是||并确保表达式不会在返回函数的前期得到一些额外的评估括号

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

答案 3 :(得分: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();">

Here is a working JSFiddle Example.

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

使用OR是不正确的,但原因是因为Short-circuit_evaluation而导致AND无法正常工作。

  • OR:评估在第一个操作数上停止,返回true,返回true
  • AND:评估在第一个操作数上停止,该操作数为false,返回false
  • 答案 4 :(得分:0)

    onsubmit =“return validateName()&amp;&amp; validatePhone()&amp;&amp; validateAddress()&amp;&amp; validateEmail()”

    使用此代码

    答案 5 :(得分:0)

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

    答案 6 :(得分:0)

    以下方法检查第一个validateName()函数,如果只有第一个函数为真,它将处理检查下一个函数,同时激活第三个函数需要返回第一个函数的真值。第二个功能。所以想象一下,如果所有功能都无效&amp;即使您有不同的错误消息,您将只看到第一个功能的错误消息。一旦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; } ">