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()をチェックするだけです... :(

明確化: 送信時に、4 つの検証関数を呼び出す必要があります。4 つの関数すべてが true を返さない限り、submit を防止する必要がありますが、そのうちのいくつかが false を返す場合でも、4 つすべてを常に呼び出す必要があります。

4

7 に答える 7

21

&の代わりに使用し&&ます。

&&短絡評価を使用するため、左側のオペランドが偽の場合は右側のオペランドを評価しません。

&常に両方のオペランドを評価します。

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

&編集:申し訳ありませんが、実際のブール値を返さないことを忘れていました。式を括弧で囲み、double!を使用して (現在) 示されているように変換します。(テストで結果を使用する場合は心配する必要はありませんがif、イベント ハンドラーからの戻り値は実際のブール値である必要があります。)

PS: これは、4 つの関数すべてが呼び出されるが、必要な全体的な true または false の結果を生成することを示す、やや不格好なデモです: http://jsfiddle.net/nnnnnn/svM4h/1/

于 2012-08-04T06:20:46.693 に答える
7

OR の代わりに AND を使用するようにコードを変更します。

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

その理由は、OR を使用すると、最初の関数が true を返した場合、javascript が他の関数をチェックする必要がないからです。また、最初のチェックが false で 2 番目のチェックが true の場合、チェックの少なくとも 1 つが TRUE であるため、フォームは引き続き送信されるため、OR は使用しません。

これが機能することを示すためにフィドルを参照してください。両方のチェックが実行され、アラートメッセージが表示されますが、チェック2がfalseを返すため、フォームは送信されません-チェック1とチェック2関数の戻り結果と&&と||の使用を試してみたい場合

問題をよりよく理解した後、単一の & を使用する必要がありますが、true & true1 を返すのではなくtrue、このように記述する必要があるためです。

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

于 2012-08-04T05:44:21.860 に答える
3

続行する前にすべての関数が true を返すことを確認することだけが必要な場合は、&&not|| を使用し、 return 関数によって式が未成熟に評価されないようにするために、余分な括弧を追加します

<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が原因です。

  • または:評価はtrueである最初のオペランドで停止し、trueが返されます
  • AND:falseの最初のオペランドで評価が停止し、falseが返されます
  • 于 2012-08-04T06:05:30.597 に答える
    0

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

    このコードを使用してください

    于 2014-05-09T11:24:53.860 に答える