ユーザーが値を変更できないので、「読み取り専用」としてマークするselect
フォームフィールドがありますが、値はまだフォームで送信されます。 disabled
属性を使用すると、ユーザーは値を変更できませんが、フォームで値を送信することはできません。
readonly
属性は、input
およびtextarea
フィールドでのみ使用できますが、基本的にはそれが必要です。それを機能させる方法はありますか?
私が検討している2つの可能性は次のとおりです。
select
を無効にする代わりに、すべてのoption
sを無効にし、CSSを使用して選択をグレーアウトし、無効になっているように見えます。<select disabled="disabled">
....
</select>
<input type="hidden" name="select_name" value="selected value" />
ここで、select_name
は、通常<select>
に付ける名前です。
別のオプション。
<select name="myselect" disabled="disabled">
<option value="myselectedvalue" selected="selected">My Value</option>
....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />
これで、使用しているWebサーバーによっては、hidden
入力を<select>
の前または後に配置する必要があることに気付きました。
IISで記憶が正しく機能する場合は、前に配置し、Apacheでは後に配置します。いつものように、テストが重要です。
フォームを送信する前に、フィールドを無効にしてから有効にします。
jQueryコード:
jQuery(function ($) {
$('form').bind('submit', function () {
$(this).find(':input').prop('disabled', false);
});
});
私はこれに対する解決策を探していましたが、このスレッドで解決策を見つけられなかったため、自分で解決しました。
// With jQuery
$('#selectbox').focus(function(e) {
$(this).blur();
});
シンプルです。フィールドに焦点を合わせたときにフィールドをぼかすだけで、無効にするようなものですが、実際にはデータを送信します。
選択フィールドの:inputセレクターでは機能しません。これを使用してください:
jQuery(function() {
jQuery('form').bind('submit', function() {
jQuery(this).find(':disabled').removeAttr('disabled');
});
});
以前の選択ボックスに基づいて選択した値をユーザーが変更できないようにしたかったという点で、少し異なるシナリオに直面しました。私がやったことは、選択ボックスで選択されていない他のすべてのオプションを無効にすることでした
$('#toSelect')find(':not(:selected)').attr('disabled','disabled');
次のコードを使用して、選択のオプションを無効にします
<select class="sel big" id="form_code" name="code" readonly="readonly">
<option value="user_played_game" selected="true">1 Game</option>
<option value="coins" disabled="">2 Object</option>
<option value="event" disabled="">3 Object</option>
<option value="level" disabled="">4 Object</option>
<option value="game" disabled="">5 Object</option>
</select>
// Disable selection for options
$('select option:not(:selected)').each(function(){
$(this).attr('disabled', 'disabled');
});
Tresが推奨する同じソリューション jQueryを使用しない
<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">
<select id="mysel" disabled="disabled">....</select>
<input name="submit" id="submit" type="submit" value="SEND FORM">
</form>
これは誰かがより理解するのに役立つかもしれませんが、明らかにjQueryのものよりも柔軟性が低いです。
送信する前に行を追加するだけです。
$( "#XYZ")。removeAttr( "disabled");
私が見つけた最も簡単な方法は、フォームに関連付けられた小さなjavascript関数を作成することでした:
function enablePath() {
document.getElementById('select_name').disabled= "";
}
ここでフォームで呼び出します:
<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">
または、フォームをチェックするために使用する関数で呼び出すことができます:)
または、JavaScriptを使用して選択の名前を変更し、無効に設定します。この方法では、選択は送信されますが、チェックしていない名前を使用します。
入力が無効になっている間、データフィールドに値を保存するクイック(Jqueryのみ)プラグインを作成しました。これは、フィールドが.prop()または.attr()...を使用してjqueryを介してプログラムで無効にされている限り、.val()、. serialize()または.serializeArra()によって値にアクセスすると常に返されることを意味します。無効にしても値:)
恥知らずなプラグイン: https://github.com/Jezternz/jq-disabled-inputs
実行可能な解決策を見つけました:選択したものを除くすべての要素を削除します。その後、スタイルを無効に見えるものに変更できます。 jQueryの使用:
jQuery(function($) {
$('form').submit(function(){
$('select option:not(:selected)', this).remove();
});
});
ヨルダンのソリューションに基づいて、無効にしたい選択と同じ名前と同じ値を持つ非表示の入力を自動的に作成する関数を作成しました。最初のパラメーターは、idまたはjquery要素です。 2番目はブール値のオプションパラメータで、「true」は入力を無効にし、「false」は入力を有効にします。省略した場合、2番目のパラメーターは、選択を「有効」と「無効」の間で切り替えます。
function changeSelectUserManipulation(obj, disable){
var $obj = ( typeof obj === 'string' )? $('#'+obj) : obj;
disable = disable? !!disable : !$obj.is(':disabled');
if(disable){
$obj.prop('disabled', true)
.after("<input type='hidden' id='select_user_manipulation_hidden_"+$obj.attr('id')+"' name='"+$obj.attr('name')+"' value='"+$obj.val()+"'>");
}else{
$obj.prop('disabled', false)
.next("#select_user_manipulation_hidden_"+$obj.attr('id')).remove();
}
}
changeSelectUserManipulation("select_id");
<select id="example">
<option value="">please select</option>
<option value="0" >one</option>
<option value="1">two</option>
</select>
if (condition){
//you can't select
$("#example").find("option").css("display","none");
}else{
//you can select
$("#example").find("option").css("display","block");
}