誰かが複数の機能をオンサブミットする方法を知っていますか?私が意図したことは、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()をチェックすることだけです... :(
CLARIFCATION:送信時に4つの検証関数を呼び出します。4つすべての関数がtrueを返さない限り送信を禁止する必要がありますが、4つすべての関数がfalseを返しても常に4つすべてを呼び出す必要があります。
&
の代わりに&&
を使用してください。
&&
は短絡評価を使用するため、左側のオペランドが偽である場合、右側のオペランドを評価しません。
&
は常に両方のオペランドを評価します。
onsubmit="return !!(validateName() & validatePhone()
& validateAddress() & validateEmail());"
編集:すみません、&
が実際のブール値を返さないことを忘れていました。式を括弧で囲み、二重の!
を使用して、表示されているとおりに変換します。 (if
テストで結果を使用するかどうかを心配する必要はありませんが、イベントハンドラーからの戻り値は実際のブール値である必要があります。)
PS:4つの関数すべてが呼び出されても、必要な全体的なtrueまたはfalseの結果が生成されることを示す、かなり不格好なデモを次に示します。 http://jsfiddle.net/nnnnnn/svM4h/1/
ORではなくANDを使用するようにコードを変更する
onsubmit = "return validateName()&& validatePhone()&& validateAddress()&& validateEmail()"
その理由は、ORを一度使用すると、最初の関数がtrueを返すと、他の関数をチェックする手間がかからなくなるためです。また、最初のチェックがfalseで、2番目がtrueの場合、少なくとも1つのチェックがTRUEであるため、フォームは引き続き送信されるため、ORを使用したくありません。
この動作を確認するには、 fiddle を参照してください。チェックが実行され、アラートメッセージが表示されますが、check2がfalseを返すため、フォームは送信されません。checks1関数とcheck2関数の戻り結果と&&および||の使用
問題をよりよく理解した後、単一の&を使用する必要がありますが、true & true
はtrue
ではなく1を返すため、次のように記述する必要があります
onsubmit = "return((validateName()&validatePhone()&validateAddress()&validateEmail())== 1)"
続行する前にすべての関数がtrueを返すことを確認する必要がある場合は、&&
ではなく||
を使用し、戻り関数によって式が成熟前に評価されないようにするには、余分な角かっこを追加します
<form id="myForm" name="myForm" action="checked.html" method="post"
onsubmit="return (validateName() && validatePhone() && validateAddress() &&
validateEmail() )">
各関数を呼び出し、その戻り値をチェックするラッパー関数を作成します。戻り値が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();">
編集:以下のブーブーを作り、修正しました。
ORの使用は正しくありませんでしたが、ANDが期待どおりに機能しないのは Short-circuit_evaluation が原因です。
onsubmit = "return validateName()&& validatePhone()&& validateAddress()&& validateEmail()"
このコードを使用
フォームを検証するには、validateForm(){}という関数を作成し、この関数内に完全な検証に必要なすべてのコードを配置しました。次に、onsubmit = "validateForm()"を使用します。順番に確認し、すべての条件が真の場合にのみ送信します。
以下のメソッドは最初にvalidateName()関数をチェックし、最初の関数のみがtrueの場合は次の関数をチェックするように処理し、3番目の関数を起動するには最初と2番目の関数のtrueを返す必要があります。したがって、すべての関数が無効で、異なるエラーメッセージが表示されている場合でも、最初の関数のエラーメッセージのみが表示されることを想像してください。 validateName()関数が渡されると、validatePhone()ectのエラーメッセージが表示される場合があります。
<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; } ">