特定の条件が与えられた場合、無効にする必要があるチェックボックスがあります。 HTTPは無効な入力をポストしないことが判明しました。
どうすればそれを回避できますか?入力が無効になっていても入力を送信し、入力を無効のままにしますか?
UPDATE:READONLY
はチェックボックスでは機能しません
disabled="disabled"
を使用できますが、この時点では、チェックボックスの値はPOST
値に表示されません。戦略の1つは、同じフォーム内にチェックボックスの値を保持する非表示フィールドを追加し、そのフィールドから値を読み戻すことです。
disabled
をreadonly
に変更するだけです
私はその問題を解決しました。
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
JQueryを使用して問題がなければ、フォームを送信するときにdisabled属性を削除します。
$("form").submit(function() {
$("input").removeAttr("disabled");
});
このように処理できます...各チェックボックスに対して、同じname
属性を持つ非表示フィールドを作成します。ただし、その非表示フィールドの値には、テストできるデフォルト値を設定してください。例えば..
<input type="checkbox" name="myCheckbox" value="agree" />
<input type="hidden" name="myCheckbox" value="false" />
フォームの送信時にチェックボックスが「チェック」されている場合、そのフォームパラメータの値は
"agree,false"
チェックボックスがチェックされていない場合、値は
"false"
「false」の代わりに任意の値を使用できますが、アイデアは得られます。
これを行う最も簡単な方法は次のとおりです。
<input type="checkbox" class="special" onclick="event.preventDefault();" checked />
これにより、ユーザーはこのチェックボックスの選択を解除できなくなり、フォームの送信時にその値を送信します。ユーザーがこのチェックボックスを選択できないようにする場合は、チェックボックスをオフにします。
また、特定の条件が満たされると、javascriptを使用してonclickをクリアできます(それが目的の場合)。ここに私が何を意味するかを示す卑劣なフィドルがあります。完璧ではありませんが、要点はわかります。
<input type="checkbox" checked="checked" onclick="this.checked=true" />
「無効になっている入力チェックボックスをPOST /送信する方法」という問題から始めました。私の答えでは、コメントをスキップしました:「チェックボックスを無効にしたい場合は、必ずプレフィックス値(チェック済みまたは未チェック)を保持する必要があります。また、ユーザーがそれを認識していることを確認します。チェックボックスではありません)」。私の答えでは、チェックボックスを常にチェックしたままにしておき、コードはこのように機能すると思いました。そのckeckboxをクリックすると、永久にチェックされ、その値はPOSTED/Submittedになります!同様に、checked = "checked"を使用せずにonclick = "this.checked = false"を記述すると(注:デフォルトはオフになります)、永久にオフになり、値はPOSTED/Submitted!になりません。
cssクラスを作成します。例:
.disable{
pointer-events: none;
opacity: 0.5;
}
無効な属性の代わりにこのクラスを適用します
これは魅力のように機能します:
唯一の欠点は、送信時に無効な入力フィールドが短く点滅することです。少なくとも私のシナリオでは、それほど問題ではありません!
$('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);
});
以来:
別の可能性を提供します:
通常どおり、チェックボックスを無効に設定します。ユーザーがフォームを送信する前に、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>
フォームが送信される前にチェックボックスが有効になっているため、その値は一般的な方法で投稿されます。このソリューションについてあまり気に入らないのは、このチェックボックスがしばらく有効になり、ユーザーに表示されることです。しかし、それは私が一緒に暮らすことができる詳細です。
無効にしないでください。代わりに、読み取り専用に設定しますが、ユーザーが状態を変更できないようにすることによる影響はありません。ただし、jQueryを使用してこれを強制できます(ユーザーがチェックボックスの状態を変更できないようにします。
$('input[type="checkbox"][readonly="readonly"]').click(function(e){
e.preventDefault();
});
これは、変更したくないすべてのチェックボックスに「読み取り専用」属性があることを前提としています。例えば。
<input type="checkbox" readonly="readonly">
onsubmit="this['*nameofyourcheckbox*'].disabled=false"
をフォームに追加します。
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
残念ながら、「単純な」解決策はありません。属性readonlyはチェックボックスに適用できません。チェックボックスに関するW3仕様を読んで、犯人を見つけました。
フォームの送信時にコントロールに現在の値がない場合、ユーザーエージェントはそれを正常なコントロールとして扱う必要はありません。( http://www.w3.org /TR/html401/interact/forms.html#h-17.13.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();'>
<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番目のチェックボックスの無効化を管理する必要はありません。
必要に応じて無効のままにして、フォームが送信される前に無効属性を削除できます。
$('#myForm').submit(function() {
$('checkbox').removeAttr('disabled');
});
onclick="this.checked=true"
Solveを追加して問題を解決します。
例:
<input type="checkbox" id="scales" name="feature[]" value="scales" checked="checked" onclick="this.checked=true" />