web-dev-qa-db-ja.com

無効になっている入力チェックボックスをPOST /送信する方法

特定の条件が与えられた場合、無効にする必要があるチェックボックスがあります。 HTTPは無効な入力をポストしないことが判明しました。

どうすればそれを回避できますか?入力が無効になっていても入力を送信し、入力を無効のままにしますか?

123
AnApprentice

UPDATEREADONLYはチェックボックスでは機能しません

disabled="disabled"を使用できますが、この時点では、チェックボックスの値はPOST値に表示されません。戦略の1つは、同じフォーム内にチェックボックスの値を保持する非表示フィールドを追加し、そのフィールドから値を読み戻すことです。

disabledreadonlyに変更するだけです

102

私はその問題を解決しました。

readonly="readonly"タグが機能しないため(別のブラウザーを試しました)、disabled="disabled"代わりに。ただし、チェックボックスの値は投稿されません...

私の解決策は次のとおりです。

"readonly"外観とPOSTチェックボックスの値を取得するには同時に、チェックボックスと同じ名前と値を持つ非表示の「入力」を追加します。チェックボックスの隣、または同じ<form></form>タグの間に配置する必要があります。

<input type="checkbox" checked="checked" disabled="disabled" name="Tests" value="4">SOME TEXT</input>

<input type="hidden" id="Tests" name="Tests" value="4" />

また、yaにreadonly="readonly", readonly="true", readonly="",またはREADONLYを知らせるだけではこれを解決できません!私はそれを理解するために数時間を費やしました!

この参照も関連していません(まだないかもしれないし、もう知らないかもしれません): http://www.w3schools.com/tags/att_input_readonly.asp

88
mik-t

JQueryを使用して問題がなければ、フォームを送信するときにdisabled属性を削除します。

$("form").submit(function() {
    $("input").removeAttr("disabled");
});
73

このように処理できます...各チェックボックスに対して、同じname属性を持つ非表示フィールドを作成します。ただし、その非表示フィールドの値には、テストできるデフォルト値を設定してください。例えば..

<input type="checkbox" name="myCheckbox" value="agree" />
<input type="hidden" name="myCheckbox" value="false" />

フォームの送信時にチェックボックスが「チェック」されている場合、そのフォームパラメータの値は

"agree,false"

チェックボックスがチェックされていない場合、値は

"false"

「false」の代わりに任意の値を使用できますが、アイデアは得られます。

10
jessegavin

これを行う最も簡単な方法は次のとおりです。

<input type="checkbox" class="special" onclick="event.preventDefault();" checked />

これにより、ユーザーはこのチェックボックスの選択を解除できなくなり、フォームの送信時にその値を送信します。ユーザーがこのチェックボックスを選択できないようにする場合は、チェックボックスをオフにします。

また、特定の条件が満たされると、javascriptを使用してonclickをクリアできます(それが目的の場合)。ここに私が何を意味するかを示す卑劣なフィドルがあります。完璧ではありませんが、要点はわかります。

http://jsfiddle.net/vwUUc/

7
thatFunkymunkey
<input type="checkbox" checked="checked" onclick="this.checked=true" />

「無効になっている入力チェックボックスをPOST /送信する方法」という問題から始めました。私の答えでは、コメントをスキップしました:「チェックボックスを無効にしたい場合は、必ずプレフィックス値(チェック済みまたは未チェック)を保持する必要があります。また、ユーザーがそれを認識していることを確認します。チェックボックスではありません)」。私の答えでは、チェックボックスを常にチェックしたままにしておき、コードはこのように機能すると思いました。そのckeckboxをクリックすると、永久にチェックされ、その値はPOSTED/Submittedになります!同様に、checked = "checked"を使用せずにonclick = "this.checked = false"を記述すると(注:デフォルトはオフになります)、永久にオフになり、値はPOSTED/Submitted!になりません。

7
PaoloMarass

cssクラスを作成します。例:

.disable{
        pointer-events: none;
        opacity: 0.5;
}

無効な属性の代わりにこのクラスを適用します

6

これは魅力のように機能します:

  1. 削除「無効」属性
  2. 送信フォーム
  3. 追加属性を再度。これを行う最良の方法は、setTimeOut関数を使用することです。 1ミリ秒の遅延があります。

唯一の欠点は、送信時に無効な入力フィールドが短く点滅することです。少なくとも私のシナリオでは、それほど問題ではありません!

$('form').bind('submit', function () {
  var $inputs = $(this).find(':input'),
      disabledInputs = [],
      $curInput;

  // remove attributes
  for (var i = 0; i < $inputs.length; i++) {
    $curInput = $($inputs[i]);

    if ($curInput.attr('disabled') !== undefined) {
      $curInput.removeAttr('disabled');
      disabledInputs.Push(true);
    } else 
      disabledInputs.Push(false);
  }

  // add attributes
  setTimeout(function() {
    for (var i = 0; i < $inputs.length; i++) {

      if (disabledInputs[i] === true)
        $($inputs[i]).attr('disabled', true);

    }
  }, 1);

});
4
Andi R

以来:

  • readonly属性をチェックボックスに設定することは、HTML仕様に従って無効です。
  • 隠し要素を使用して値を送信することは、あまりきれいな方法ではありません。
  • 値の変更を防ぐonclick JavaScriptを設定することはあまり良いことではありません

別の可能性を提供します:

通常どおり、チェックボックスを無効に設定します。ユーザーがフォームを送信する前に、JavaScriptでこのチェックボックスを有効にします。

<script>
    function beforeSumbit() {
        var checkbox = document.getElementById('disabledCheckbox');
        checkbox.disabled = false;
    }
</script>
...
<form action="myAction.do" method="post" onSubmit="javascript: beforeSubmit();">
    <checkbox name="checkboxName" value="checkboxValue" disabled="disabled" id="disabledCheckbox" />
    <input type="submit />
</form>

フォームが送信される前にチェックボックスが有効になっているため、その値は一般的な方法で投稿されます。このソリューションについてあまり気に入らないのは、このチェックボックスがしばらく有効になり、ユーザーに表示されることです。しかし、それは私が一緒に暮らすことができる詳細です。

3
sporak

無効にしないでください。代わりに、読み取り専用に設定しますが、ユーザーが状態を変更できないようにすることによる影響はありません。ただし、jQueryを使用してこれを強制できます(ユーザーがチェックボックスの状態を変更できないようにします。

$('input[type="checkbox"][readonly="readonly"]').click(function(e){
    e.preventDefault();
});

これは、変更したくないすべてのチェックボックスに「読み取り専用」属性があることを前提としています。例えば。

<input type="checkbox" readonly="readonly">
3
Peter

onsubmit="this['*nameofyourcheckbox*'].disabled=false"をフォームに追加します。

1
GuiltyScarl3t

hiddenフィールド以外のオプションはないため、以下のコードに示すようなhiddenフィールドを使用してください。

<input type="hidden" type="text" name="chk1[]" id="tasks" value="xyz" >
<input class="display_checkbox" type="checkbox" name="chk1[]" id="tasks" value="xyz" checked="check"  disabled="disabled" >Tasks
1
Om R Kattimani

残念ながら、「単純な」解決策はありません。属性readonlyはチェックボックスに適用できません。チェックボックスに関するW3仕様を読んで、犯人を見つけました。

フォームの送信時にコントロールに現在の値がない場合、ユーザーエージェントはそれを正常なコントロールとして扱う必要はありません。http://www.w3.org /TR/html401/interact/forms.html#h-17.13.2

これにより、チェックされていない状態と無効な状態が同じ解析値になります。

  • readonly = "readonly"はチェックボックスの有効な属性ではありません。
  • onclick = "event.preventDefault();"チェックボックス自体でトリガーされるため、常に良い解決策とは限りません。ただし、場合によっては魅力的に機能します。
  • コントロールがまだ成功したコントロールとして扱われず、値が解析されないため、チェックボックスのonSubmitを有効にしても解決しません。
  • HTMLに同じ名前の別の非表示の入力を追加しても機能しません。最初のコントロール値は同じ名前であるため、2番目のコントロール値で上書きされるためです。

これを行う唯一の完全な方法は、フォームの送信時にjavascriptで同じ名前の非表示の入力を追加するです。

このために作成した小さなスニペットを使用できます。

function disabled_checkbox() {
  var theform = document.forms[0];
  var theinputs = theform.getElementsByTagName('input');
  var nrofinputs = theinputs.length;
  for(var inputnr=0;inputnr<nrofinputs;inputnr++) {
    if(theinputs[inputnr].disabled==true) {
      var thevalueis = theinputs[inputnr].checked==true?"on":"";
      var thehiddeninput = document.createElement("input");
      thehiddeninput.setAttribute("type","hidden");
      thehiddeninput.setAttribute("name",theinputs[inputnr].name);
      thehiddeninput.setAttribute("value",thevalueis);
      theinputs[inputnr].parentNode.appendChild(thehiddeninput);
    }
  }
}

これにより、ドキュメント内の最初のフォームが検索され、すべての入力が収集され、無効な入力が検索されます。無効な入力が検出されると、同じ名前と値「on」(状態が「checked」の場合)および ''(状態が ''の場合-非チェック)の隠し入力がparentNodeに作成されます。

この関数は、FORM要素のイベント 'onsubmit'によって次のようにトリガーされる必要があります。

<form id='ID' action='ACTION' onsubmit='disabled_checkbox();'>
1
JPA
<html>
    <head>
    <script type="text/javascript">
    function some_name() {if (document.getElementById('first').checked)      document.getElementById('second').checked=false; else document.getElementById('second').checked=true;} 
    </script>
    </head>
    <body onload="some_name();">
    <form>
    <input type="checkbox" id="first" value="first" onclick="some_name();"/>first<br/>
    <input type="checkbox" id="second" value="second" onclick="some_name();" />second
    </form>
    </body>
</html>

関数some_nameは、節に従ってチェックされる(値をポストする)またはチェックされない(値をポストしない)2番目のチェックボックスを管理する前の節の例であり、ユーザーはそのステータスを変更できません。 2番目のチェックボックスの無効化を管理する必要はありません。

0
paolomarass

必要に応じて無効のままにして、フォームが送信される前に無効属性を削除できます。

$('#myForm').submit(function() {
    $('checkbox').removeAttr('disabled');
});
0
Sergej Fomin

onclick="this.checked=true"Solveを追加して問題を解決します。
例:

<input type="checkbox" id="scales" name="feature[]" value="scales" checked="checked" onclick="this.checked=true" />
0
berramou