「マルチセレクトで選択できる数を制限したい!」とリクエストボードより投稿をいただきました。
要望にお応えして、”マルチセレクトで選択できる数を制限する強化ガジェット”を作ってみました!
ビジュアル設定に対応していますので、制限を入れたいと思っている方は、ぜひ参考にしてください。
変更・改定履歴
-
改定
マルチセレクトの設定値をname値からフィールドIDに変更
-
改定
コメントアウトの文章を修正
-
改定
ver.2.20アップデートに伴い注意事項を追記
前提
ブロックの JavaScript タブに入れて設定値を変更することで使用できます。
制限方法を、2つ用意しています。
1. 制限数を超えてチェックをした場合、アラートによるエラーメッセージを表示する
2. 制限数をチェック時点で、それ以上の選択を不可とする
※ 選択不可の場合、「ヘルプテキスト」に注意文言などの記載をお願いします
マルチセレクトは、チェックボックスのみに対応しており、
セレクト等のデザインに変更された場合、動作しない可能性があります。ご注意ください。
マルチセレクトが1つの場合
「checkBoxName」「selectNum」「selectNumOver」の3つの値を設定いただけます。
checkBoxName | マルチセレクトのフィールドIDを設定します。 フィールドIDが10の場合、「10」を '' の間に設定します。 |
---|---|
selectNum | 上限数を設定します。 数字は半角数字で設定し、こちらは '' の記載は不要です。 |
selectNumOver | アラートによるエラーメッセージを表示する場合に設定します。 選択不可の処理とする場合は、こちらの設定は不要です。 エラーメッセージに関しては、"" の間に設定します |
// 設定値 const checkBoxName = "f0" + ""; // 選択数制限を行いたい項目のフィールドID const selectNum = 3; // 選択可能数(半角数字) // エラーメッセージがある場合、アラートによるエラーメッセージが表示されます // エラーメッセージがない場合、個数以上の選択が不可となります(エラーメッセージは表示されません) const selectNumOver = "エラーメッセージ"; // 原則変更不可 // 複数強化パーツがある場合、変更あり window.onload = function () { checkBoxSetting(); }; // 変更不可 // 複数強化パーツがある場合、下記を変更不可箇所に追加 const list = document.getElementsByName(checkBoxName); function checkBoxSetting() { let count = 0; let flg = []; if(0 < list.length){ for (var i = 0; i < list.length; i++) { var element = list[i]; element.setAttribute('onchange', 'selectNumCheck('+ i +')'); flg[i] = false; if (element.checked) { flg[i]= true; count++; } } if(selectNum <= count && !selectNumOver) { for (var i=0; i<list.length; i++){ if(flg[i] == true){ list[i].disabled =false; }else{ list[i].disabled = true; } } } } } // チェックボックスにチェックできる数を制限する function selectNumCheck(num){ let count = 0; let flg = []; for (var i = 0; i < list.length; i++) { flg[i] = false; if (list[i].checked) { flg[i]= true; count++; } } if(selectNumOver){ if(selectNum < count) { alert(selectNumOver); list[num].checked = false; return false; } }else{ if(selectNum <= count) { for (var i=0; i<list.length; i++){ if(flg[i] == true){ list[i].disabled =false; }else{ list[i].disabled = true; } } }else{ for (var i=0; i<list.length; i++){ list[i].disabled = false; } } } }
マルチセレクトが複数の場合
複数個のマルチセレクトを設定できるように設計してあり、
1つの場合と同様に「checkBoxName」「selectNum」「selectNumOver」の3つの値を設定いただけます。
[] 内の値を「,」区切りで制限が必要な数だけ設定する仕組みとなっています。
使用する際に下記を注意してください。
1. 「,」区切りで設定する項目の順番をそろえる
2. 設定する値の数をそろえる
3. エラーメッセージを出さない場合、「''」で設定する個数をそろえる
// 設定値 const checkBoxName = ['','']; // 選択数制限を行いたい項目のname値 const selectNum = [1,2]; // 選択可能数(半角数字) // エラーメッセージがある場合、アラートによるエラーメッセージが表示されます // エラーメッセージがない場合、個数以上の選択が不可となります(エラーメッセージは表示されません) const selectNumOver = ['エラーメッセージ','']; // 原則変更不可 // 複数強化パーツがある場合、変更あり window.onload = function () { checkBoxSetting(); }; // 変更不可 // 複数強化パーツがある場合、下記を変更不可箇所に追加 function checkBoxSetting() { let count = 0; let flg = []; let list = []; for (var checkBoxNum = 0; checkBoxNum < checkBoxName.length; checkBoxNum++) { list[checkBoxNum] = document.getElementsByName(checkBoxName[checkBoxNum]); for (var i = 0; i < list[checkBoxNum].length; i++) { var element = list[checkBoxNum][i]; element.setAttribute('onchange', 'selectNumCheck('+ checkBoxNum +','+ i +')'); flg[i] = false; if (element.checked) { flg[i]= true; count++; } } if(selectNum[checkBoxNum] <= count && !selectNumOver[checkBoxNum]) { for (var i=0; i<list[checkBoxNum].length; i++){ if(flg[i] == true){ list[checkBoxNum][i].disabled =false; }else{ list[checkBoxNum][i].disabled = true; } } } } } // チェックボックスにチェックできる数を制限する function selectNumCheck(checkBoxList,val){ let list = document.getElementsByName(checkBoxName[checkBoxList]); let count = 0; let flg = []; for (var i = 0; i < list.length; i++) { flg[i] = false; if (list[i].checked) { flg[i]= true; count++; } } if(selectNumOver[checkBoxList]){ if(selectNum[checkBoxList] < count) { alert(selectNumOver[checkBoxList]); list[val].checked = false; return false; } }else{ if(selectNum[checkBoxList] <= count) { for (var i=0; i<list.length; i++){ if(flg[i] == true){ list[i].disabled =false; }else{ list[i].disabled = true; } } }else{ for (var i=0; i<list.length; i++){ list[i].disabled = false; } } } }
JQuery を使えばもう少し楽に設定できますが、今回は JavaScript のみで作成しています。
複数の項目や選択肢が多い場合、JavaScriptの都合上、ラグが出てしまう可能性があるのでご了承ください。
また、不具合やほかのやり方がある等あれば、下記の「コンテンツに関しての要望はこちら」からご連絡ください。