2016-08-31 8 views
4

私はすべての未チェックのチェックボックスを削除し、隠しフィールドと値を "いいえ"に置き換えるスクリプトを自分のHTMLフォームに追加しようとしています。チェックボックスがチェックされている場合、「はい」の値が表示されます。私のフォームスクリプトは2回目の投稿でのみ機能するのはなぜですか

私が前に提案し見てきたように私はそれをホストするサイトは、同じ名前を持つ2つのフォームフィールドを許可していないので、私は、フォームにこの隠しフィールドを追加することはできません、ご注意:いくつかのためにPost the checkboxes that are unchecked

を理由は、スクリプトは、ページを読み込んで、すべてのチェックボックスをオフにしてフォームを送信してからフォームを再送信するときにのみ機能します。私がページをリロードすると、私は同じことをやり直さなければならない。これは私が何を参照しているかを示しています:

私は最初のフォーム提出の後にイベントリスナーを追加していますか?ここで

は、サンプルコードとフィドルである:ここではhttps://jsfiddle.net/gvd1jr0o/6/

は私のスクリプトです:

$("#foo").submit(
    function() { 
    var formEl = $(this);//get the reference of the form 
    debugger; 
    // Add an event listener on #foo submit action... 
    // For each unchecked checkbox on the form... 
    formEl.find("input:checkbox:not(:checked)").each(

     // Create a hidden field with the same name as the checkbox and a value of 0 
     // You could just as easily use "off", "false", or whatever you want to get 
     // when the checkbox is empty. 
     function(index) { 
     var input = $("<input>"); 
     input.attr('type', 'hidden'); 
     input.attr('name', $(this).attr("name")); // Same name as the checkbox 
     input.attr('value', "no"); // or 'off', 'false', 'no', whatever 

     // append it to the form the checkbox is in just as it's being submitted 
     formEl.append(input); //$("#foo") is referring to the form 

     } // end function inside each() 
    ); // end each() argument list 

    return true; // Don't abort the form submit 

    } // end function inside submit() 
);       
+1

あなたのフィドルが最初にクリックするとフォームを送信しています。何か不足していますか? –

+0

フォームは送信されますが、最初のフォーム送信ではチェックされていないチェックボックスの値は「いいえ」にする必要があります。それはしていない。それをどのようにフィドルで表示するかは分かりませんでした。だから、私はちょうどスクリプトを使ってシンプルなフォームを表示するためにフィドルを使用しました – cgrouge

+0

私はまだネットワークタブに掲示された値 "いいえ"を参照してください..しかし、唯一の違いは内部の機能が提出の2回目に実行されます.. –

答えて

1

あなたはこれについて間違った方法をとっていると思います。

まず、すべてのチェックされていないチェックボックスのチェックボックスを作成するフォームまたはページにonLoadイベントハンドラを追加します。次に、チェックボックスの要素にイベントハンドラを作成します。イベントハンドラは、チェックされた状態が変更されたときに、そのチェックボックスに関連する入力要素を作成または削除します。フォームを送信すると、チェックボックスはすでに作成されています。私は現在あなたのチェックボックスが作成される前にあなたのフォームが提出されている競合状態があると思います。

イベントハンドラをチェックボックスやフォーム/ページに追加する方法の詳細については、jQueryのドキュメントを参照してください。

+0

イベントハンドラを追加することができます。チェックされている場合は何も行いません。チェックされていない場合は、非チェック入力を置き換える非表示の入力フィールドを作成し、 "いいえ"という値を付けます。ここに、私が素早く起草したものがあります。 :https://jsfiddle.net/qj8Lzsg7/ – cgrouge

+0

ここで2つの機能を実行する必要がありますか?最初は、ページがロードされたときにチェックされていないすべてのチェックボックスに非表示の入力フィールドを与えます。クリックしたときに削除される2番目の関数を作成しますか? – cgrouge

+0

@cgrougeあなたの最初のコメントでは、はいと言っています。 – Nzall

0

あなたのフィドルが正常に動作し(私は理解されるように)。 document.ready()に入れてもいいし、コンソールが開いているときにデバッガーを忘れていても構いません(愚かです)。私がチェックしたときにはいを設定するために書かれた何のコードはありません。..コードの下にチェックし、必要な場合は私に知らせて、提出するための入力タグとのpreventDefaultを追加変更した

+0

私は両方をしなければならないでしょうか? document.ready()にスクリプトをラップし、デバッガを削除しますか? – cgrouge

+0

私があなたの提案から得たものであり、同じ問題をまだ見ている:https://jsfiddle.net/uy5vbj7p/ – cgrouge

0

..

$(function() { 
 
$("#foo").submit(
 
    function(e) { 
 
    e.preventDefault(); 
 
    \t var formEl = $(this);//get the reference of the form 
 
    debugger; 
 
    // Add an event listener on #foo submit action... 
 
    // For each unchecked checkbox on the form... 
 
    formEl.find("input:checkbox:not(:checked)").each(
 

 
     // Create a hidden field with the same name as the checkbox and a value of 0 
 
     // You could just as easily use "off", "false", or whatever you want to get 
 
     // when the checkbox is empty. 
 
     function(index) { 
 
     var input = $("<input/>"); 
 
     input.attr('type', 'hidden'); 
 
     input.attr('name', $(this).attr("name")); // Same name as the checkbox 
 
     input.attr('value', "no"); // or 'off', 'false', 'no', whatever 
 

 
     // append it to the form the checkbox is in just as it's being submitted 
 
     formEl.append(input); //$("#foo") is referring to the form 
 

 
     } // end function inside each() 
 
    ); // end each() argument list 
 

 
    return true; // Don't abort the form submit 
 

 
    } // end function inside submit() 
 
);             
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form id="foo"> 
 
    <input type=checkbox name="c1"/> 
 
    <input type=checkbox name="c2"/> 
 
    <input type=checkbox name="c3"/> 
 
    <input type=submit value=submit /> 
 
</form>

+0

この解決策は素晴らしいものですが、何らかの理由で2回目の提出にのみ役立ちます。チェックされていないボックスには「いいえ」と入力する最初の投稿を得ることができません。チェックした場合、チェックボックスの値をyesに設定していますので、これはスクリプトに含める必要はありません。 – cgrouge

+0

今すぐチェックしてください。 '$(function(){}'を追加しました – CNKR

+0

私は編集しませんあなたの答え – cgrouge

関連する問題