jQuery UI Sortable を使用して、一連のラジオ ボタンにリンクされた分類された選択を実装しています。この部分は数年間うまく機能しています。( jsFiddle バージョンを参照してください。 ) ここで、クライアントはそれを変更したいと考えています。一部のアイテムは特定のカテゴリにしか入れないようにする必要があり、私は完全に立ち往生しています。
バックエンドでは、特定のラジオ ボタンを無効にするのは簡単です。
<ul id="L" class="L ui-sortable">
Available (A):
<li id='L_1'>
<input type='radio' name='L_1' id='L_1_A' value='A'>
<label for='L_1_A'>A</label>
<input type='radio' name='L_1' id='L_1_B' disabled='disabled' value='B'>
<label for='L_1_B'>B</label>
<input type='radio' name='L_1' id='L_1_C' value='C'>
<label for='L_1_C'>C</label>
Item 1 can't go in B
</li>
<li id='L_2'>
<input type='radio' name='L_2' id='L_2_A' value='A'>
<label for='L_2_A'>A</label>
<input type='radio' name='L_2' id='L_2_B' value='B'>
<label for='L_2_B'>B</label>
<input type='radio' name='L_2' id='L_2_C' disabled='disabled' value='C'>
<label for='L_2_C'>C</label>
Item 2 can't go in C
</li>
<!-- etc. -->
</ul>
<ul id='L_B' class='L ui-sortable cat'>Selected - B</ul>
<ul id='L_C' class='L ui-sortable cat'>Selected - C</ul>
(ラジオ ボタンは、CSS と JavaScript の組み合わせによって非表示になります。) これには、不適切な分類を保存することが不可能になるという副作用があります。分類できないカテゴリに何かを入れようとすると、選択内容は完全に無視されます。 (無効なラジオ ボタンは値を返さないため)。しかし、戻って保存した記録を見ない限り、何が起こったのかわかりません。あなたには、いつものように箱にアイテムを入れたように見えます。
私が望むのは、無効なラジオ ボタンにリンクされている宛先ボックスが、アイテムがつかまれたときに「灰色になる」ようにすることです。それでも、そのボックスにアイテムを入れようとすると、アイテムは開始点に戻る必要があります。$("ul.notallowed").sortable("option","disabled",true);
基本的に、 を設定した場合と同じように動作する必要がありますが、ユーザーが許可されていないアイテムを「保持」している間のみです。
.is(":disabled")
ラジオ ボタンが無効になっているかどうかを確認するコマンドがあることは知っていますが、どこに配置すればよいかわかりません。
既存の実装の JavaScript は次のとおりです。つまり、すべてのアイテムに対してすべてのカテゴリが許可されます。(これをコーディングするためのより良い/より効率的な方法があると確信していますが、それが機能することを嬉しく思います。)
$(function() {
$("#L").sortable({
connectWith: '.L',
containment: '#ListContainer',
receive: function(event, ui) {
$(ui.item).find('input:radio')[0].checked = true;
}
}).disableSelection();
$("#L_B").sortable({
connectWith: '.L',
containment: '#ListContainer',
receive: function(event, ui) {
$(ui.item).find('input:radio')[1].checked = true;
}
}).disableSelection();
$("#L_C").sortable({
connectWith: '.L',
containment: '#ListContainer',
receive: function(event, ui) {
$(ui.item).find('input:radio')[2].checked = true;
}
}).disableSelection();
});
$(document).ready(function() {
$('.B').closest('li').appendTo("#L_B");
$('.C').closest('li').appendTo("#L_C");
$('ul.ui-sortable').width("10em");
$('ul.ui-sortable li').css({cursor:'pointer'});
});
私は、中括弧を含むプログラミング言語がまったく苦手であることに注意してください。私は上記のコードを書きましたが、それが機能する理由は言うまでもなく、そのほとんどが何をするのかを説明できませんでした。できるだけ簡単な言葉で答えを組み立てていただければ幸いです。