ラジオボタンを「読み取り専用」にできないのはなぜですか?


213

ラジオボタンを表示し、その値を送信してもらいたいのですが、状況によっては編集できないようにしてください。Disabledは値を送信しないため(またはそうですか?)機能せず、ラジオボタンがグレー表示されます。読み取り専用は本当に私が探しているものですが、いくつかの不思議な理由でそれはうまくいきません。

期待どおりに動作するように読み取り専用にするために引っ張る必要がある奇妙なトリックはありますか?代わりにJavaScriptで実行する必要がありますか?

ちなみに、他の入力タグでは機能するのに、ラジオボタンでは読み取り専用が機能しない理由を誰かが知っていますか?これは、HTML仕様での理解できない省略の1つですか?


5
「これは、HTML仕様のわかりにくい省略の1つですか?」ユーザーの観点から考えてください。なぜクリックできないボタンを表示するのですか?
ポールD.ウェイト

67
なぜクリックできないボタンを表示するのですか?ボタンがあることを彼らに知らせたいのですが、今は彼らがボタンをクリックできるようにしたくありません。しかし、おそらく後で。結局のところ、それはダイナミックなフォームです。ラジオボタンが他の入力フィールドと異なるのはなぜですか?
mcv 2009

7
ここでは仕様です: w3.org/TR/html401/interact/forms.html#h-17.12.2を 「次の要素がreadonly属性をサポートしています。INPUTとTEXTAREAを」これは明らかに間違っています。ここに戻って、しかし、我々は、より正確な概要を参照してください。 w3.org/TR/WD-forms-970402#readonly 「READONLYは、テキストまたはPASSWORD及びTEXTAREA要素へのINPUT要素に適用されます。」これは、recとspecのギャップの間でずれているように見えます。
graphicdivine 2009

さらに好奇心が強い。この古いドキュメントによると、「たとえば、チェックボックスでは、チェックボックスをオンまたはオフに(つまり、CHECKED状態を設定)できますが、フィールドの値は変更しません。」(htmlcodetutorial.com/forms/_INPUT_DISABLED.html)これは本当ですか?チェックボックス/ラジオにREADONLYを設定すると、ユーザーが明らかに変更できる場合でも、値がロックされますか?
graphicdivine 2009

:[ここ]私のポストをチェックし、[1] [1]の問題にクリーンなシンプルなソリューションを提供しますstackoverflow.com/a/15513256/1861389
driven4ward

回答:


149

チェックされていないラジオボタンのみを無効にすることにより、ラジオボタンの読み取り専用を偽装しました。これにより、ユーザーは別の値を選択できなくなり、チェックされた値は常に送信時に送信されます。

jQueryを使用して読み取り専用にする:

$(':radio:not(:checked)').attr('disabled', true);

この方法は、選択されていないオプションをそれぞれ無効にする必要があることを除いて、選択リストを読み取り専用にするためにも機能しました。


2
おかげ@Megan、これは素晴らしいソリューションである
マイケル・ラVoie

9
readonlyOPが機能することを期待していたので、プロパティを使用できるようにするためのバリエーション:$(':radio[readonly]:not(:checked)').attr('disabled', true);
wodow

1
以下のソリューションの中で、このソリューションは最もクリーンなコードを提供し、フィールドを有効/無効にする必要がなく、フォームの送信時にバインド解除クリックイベントを処理して再バインドする必要がないため、Jqueryバリデーターとうまく連携します。
Kristianne Nerona

正確に動作します。ありがとう
Hassan Farooq 2018年

賢い!.not(..)を使用して、選択した入力フィールドのセットがすでにある場合:var myRadios = $( '#specific-radios'); myRadios.not( ':checked')。prop( 'disabled'、true); api.jquery.com/not
JoePC 2018

206

ラジオボタンは、他のオプションがある場合にのみ読み取り専用にする必要があります。他にオプションがない場合、チェックされているラジオボタンのチェックを外すことはできません。他のオプションがある場合、他のオプションを無効にするだけで、ユーザーが値を変更できないようにすることができます。

<input type="radio" name="foo" value="Y" checked>
<input type="radio" name="foo" value="N" disabled>

フィドル:http : //jsfiddle.net/qqVGu/


3
最初の解決策の問題は、JavaScriptでラジオボタンを有効にしたい場合、突然同じ名前の2つのフィールドがあるため、そのうちの1つをクリーンアップする必要があることです。または、非表示のものを実際に使用し、ラジオボタンで非表示フィールドの値を設定するだけです。Etherの方法、それは私がラジオボタンになりたいよりも少し面倒です。2つ目の解決策は、確実に機能することは間違いありませんが、本当に醜いハックのように聞こえます。だから私はJavaScriptのソリューションが私の基準を満たす唯一のものだと思います。私はそれで行きます。
mcv 2009

7
解決策1してください!これは、適切にアクセスできる唯一のものです。スクリプトを記述する必要がある場合は、非表示フィールドの有効性を無線の有効性の反対に設定するための1行だけです。
ボビンス、2009

5
ソリューション2と3がジョナサンの回答の位置を入れ替えたので、コメントがあまり意味をなさないようになりました。
mcv 2009

1
JavaScriptソリューションが機能していないことに注意してください。ボタンのチェックを外すだけです。onclick="return false"変化を防ぐことが必要だと思います。
ドミトリー2012年

2
ラジオを「無効」に設定するとき、「無効なカーソル」を削除するために「style = cursor:default」を追加します。
ジョアンパウロ

24

これはあなたがうまくいくトリックです。

<input type="radio" name="name" onclick="this.checked = false;" />

4
まさに私が考えていたことですが、それがonClick="this.checked = <%=value%>"いくつかの種類のものである必要があることを明確にした方がいいでしょう:)
JustLoren

知っておくと便利です。checkedは、trueまたはfalseのいずれかの値を持つことができます。
Sarfraz、

デフォルトでオンになっていないjavascriptを使用して閲覧する私たちにとっては、これは機能しないという警告だけです。
tloach 2009

3
私の場合は問題ありません。すでに大量のjQueryとAjaxを使用しています。
mcv 2009

1
onclick="return false;"グループの値を同じに保つためだけに実行できることに注目する価値がある
Zach

12

私はデータベースに投稿する長いフォーム(250以上のフィールド)を持っています。オンライン雇用申請書です。管理者が提出されたアプリケーションを見に行くと、フォームにはデータベースからのデータが入力されます。入力テキストとテキストエリアは送信されたテキストに置き換えられますが、ラジオとチェックボックスはフォーム要素として保持するのに役立ちます。それらを無効にすると、読みにくくなります。.checkedプロパティをfalseに設定すると、ユーザーがアプリに入力することによってチェックされた可能性があるため、onclickは機能しません。とにかく...

onclick="return false;"

ラジオとチェックボックスを無効にするための魅力のように機能します。


8

最良の解決策は、チェック済みまたは未チェックの状態を(クライアントまたはサーバーから)設定し、ワードの後でユーザーが変更できないようにする(つまり、読み取り専用にする)ことです。

<input type="radio" name="name" onclick="javascript: return false;" />

番号!この場合、ユーザーはブラウザでhtmlを編集し、必要なオプションを選択済みとしてマークして、フォームを投稿できます。
error1009

2

チェックボックスとラジオボタンの読み取り専用状態を実現するために、JavaScriptを多用した方法を考え出しました。現在のバージョンのFirefox、Opera、Safari、Google Chrome、およびIEの現在および以前のバージョン(IE7まで)に対してテストされています。

単に無効にしたプロパティを使用しないでください。ページを印刷すると、無効な入力要素が灰色で表示されます。これが実装された顧客は、すべての要素が同じ色になることを望んでいました。

会社で働いている間に開発したため、ここにソースコードを投稿できるかどうかはわかりませんが、コンセプトを共有することはできます。

onmousedownイベントでは、クリックアクションが変更する前に選択状態を読み取ることができます。したがって、この情報を保存してから、onclickイベントでこれらの状態を復元します。

<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>

<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>

これのjavascript部分は次のように機能します(ここでも概念のみ)。

var selectionStore = new Object();  // keep the currently selected items' ids in a store

function storeSelectedRadiosForThisGroup(elementName) {
    // get all the elements for this group
    var radioOrSelectGroup = document.getElementsByName(elementName);

    // iterate over the group to find the selected values and store the selected ids in the selectionStore
    // ((radioOrSelectGroup[i].checked == true) tells you that)
    // remember checkbox groups can have multiple checked items, so you you might need an array for the ids
    ...
}

function setSelectedStateForEachElementOfThisGroup(elementName) {
    // iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
    ...

    // make sure you return false here
    return false;
}

入力要素のonclickおよびonmousedownプロパティを変更することにより、ラジオボタン/チェックボックスを有効/無効にできるようになりました。


2

JavaScriptの方法-これでうまくいきました。

<script>
$(document).ready(function() {
   $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); });
});
</script>

理由:

  1. $('#YourTableId').find('*') ->これはすべてのタグを返します。

  2. $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); }); これでキャプチャされたすべてのオブジェクトを反復処理し、入力タグを無効にします。

分析(デバッグ):

  1. form:radiobutton 内部的には「入力」タグと見なされます。

  2. 上記のfunction()のように、印刷しようとすると document.write(this.tagName);

  3. タグでラジオボタンが見つかった場合は常に、入力タグを返します。

したがって、上記のコード行は、*を入力に置き換えることで、ラジオボタンタグに対してさらに最適化できます。 $('#YourTableId').find('input').each(function () { $(this).attr("disabled", true); });


1

非常に簡単なオプションは、フォームの「onsubmit」イベントで呼び出されるJavaScript関数を作成して、ラジオボタンを有効にし、フォームの残りの部分にその値が送信されるようにすることです。
HTML仕様では省略されていないようですが、デザインの選択(論理的なもの、IMHO)では、ラジオボタンはボタンにできないため、読み取り専用にすることはできません。使用しない場合は、それを無効にします。


1

使用onclick='this.checked = false;'はある程度うまくいったことがわかりました。クリックされたラジオボタンは選択されません。ただし、既に選択されているラジオボタン(たとえば、デフォルト値)があった場合、そのラジオボタンは選択解除されます。

<!-- didn't completely work -->
<input type="radio" name="r1" id="r1" value="N" checked="checked" onclick='this.checked = false;'>N</input>
<input type="radio" name="r1" id="r1" value="Y" onclick='this.checked = false;'>Y</input>

このシナリオでは、デフォルト値をそのままにして他のラジオボタンを無効にすると、すでに選択されているラジオボタンが保持され、選択解除されなくなります。

<!-- preserves pre-selected value -->
<input type="radio" name="r1" id="r1" value="N" checked="checked">N</input>
<input type="radio" name="r1" id="r1" value="Y" disabled>Y</input>

このソリューションは、デフォルト値の変更を防ぐ最も洗練された方法ではありませんが、JavaScriptが有効かどうかに関係なく機能します。


1

選択されていないラジオボタンについては、無効のフラグを付けます。これにより、ユーザーがユーザー入力に応答したり、チェックされたラジオボタンをクリアしたりできなくなります。例えば:

<input type="radio" name="var" checked="yes" value="Yes"></input>
<input type="radio" name="var" disabled="yes" value="No"></input>

4
checked="yes"?それは何の仕様ですか?使用するchecked="checked"checked、値のない属性のみを使用します。も同じですdisabled
ロビンファンバーレン2014年

1

属性を試してみてくださいdisabled。ただし、ラジオボタンの値は取得できないと思います。または、次のように画像を設定します。

<img src="itischecked.gif" alt="[x]" />radio button option

宜しくお願いします。


1
ああ、私のhtmlコードは取り除かれました:img src = "itIsChecked.gif" alt = "[x]" OptionChecked
Tim

0

チェックボックス/ラジオの入力要素をスタイルするJS プラグインを使用しており、次のjQueryを使用して、基になる値がまだ投稿されているが、入力要素がユーザーにアクセスできないように見える「読み取り専用状態」を確立しています。これは、意図された理由だと思います読み取り専用の入力属性を使用します...

if ($(node).prop('readonly')) {
    $(node).parent('div').addClass('disabled'); // just styling, appears greyed out
    $(node).on('click', function (e) {
        e.preventDefault();
    });
}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.