クライアントは、リスト内の個別のアイテムとしてアイテム名とともにチェックボックスを含む[オプションの選択]メニューを持つデザインを私にくれました。とにかく、オプションの選択メニュー内にチェックボックスを追加することは可能ですか?
注意:メニューを有効にするには、開発者が独自のIDを追加する必要があります。可能な場合は、HTML CSSコードのみが必要です。
クライアントは、リスト内の個別のアイテムとしてアイテム名とともにチェックボックスを含む[オプションの選択]メニューを持つデザインを私にくれました。とにかく、オプションの選択メニュー内にチェックボックスを追加することは可能ですか?
注意:メニューを有効にするには、開発者が独自のIDを追加する必要があります。可能な場合は、HTML CSSコードのみが必要です。
回答:
select要素内にチェックボックスを配置することはできませんが、HTML、CSS、JavaScriptを使用して同じ機能を得ることができます。可能な解決策は次のとおりです。次に説明します。
var expanded = false;
function showCheckboxes() {
var checkboxes = document.getElementById("checkboxes");
if (!expanded) {
checkboxes.style.display = "block";
expanded = true;
} else {
checkboxes.style.display = "none";
expanded = false;
}
}
.multiselect {
width: 200px;
}
.selectBox {
position: relative;
}
.selectBox select {
width: 100%;
font-weight: bold;
}
.overSelect {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
#checkboxes {
display: none;
border: 1px #dadada solid;
}
#checkboxes label {
display: block;
}
#checkboxes label:hover {
background-color: #1e90ff;
}
<form>
<div class="multiselect">
<div class="selectBox" onclick="showCheckboxes()">
<select>
<option>Select an option</option>
</select>
<div class="overSelect"></div>
</div>
<div id="checkboxes">
<label for="one">
<input type="checkbox" id="one" />First checkbox</label>
<label for="two">
<input type="checkbox" id="two" />Second checkbox</label>
<label for="three">
<input type="checkbox" id="three" />Third checkbox</label>
</div>
</div>
</form>
最初に、「オプションを選択してください」というテキストを表示するselect要素と、select要素を覆う(オーバーラップする)空の要素(<div class="overSelect">
)を作成します。ユーザーがselect要素をクリックするのは望ましくありません-空のオプションが表示されます。要素を他の要素とオーバーラップするには、CSSの位置プロパティを使用して、相対値を指定します。絶対の。
機能を追加するには、ユーザーがselect要素(<div class="selectBox" onclick="showCheckboxes()">
)を含むdivをクリックしたときに呼び出されるJavaScript関数を指定します。
また、チェックボックスを含むdivを作成し、CSSを使用してスタイルを設定します。上記のJavaScript関数<div id="checkboxes">
は、CSS表示プロパティの値を「なし」から「ブロック」に、またはその逆に変更するだけです。
ソリューションは次のブラウザーでテストされました:Internet Explorer 10、Firefox 34、Chrome39。ブラウザーではJavaScriptを有効にする必要があります。
CSSの配置
http://www.w3schools.com/css/css_positioning.asp
CSS表示プロパティ
overselect
私が使用した複雑なインターフェースでいくつかの問題を引き起こす可能性のあるdivの代わりに<option selected hidden>Select an option</option>
。それは最善の使い方ではないかもしれませんが、hidden
動作します。
これまでのところ最高のプラグインはBootstrap Multiselectです
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery Multi Select Dropdown with Checkboxes</title>
<link rel="stylesheet" href="css/bootstrap-3.1.1.min.css" type="text/css" />
<link rel="stylesheet" href="css/bootstrap-multiselect.css" type="text/css" />
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script>
<script type="text/javascript" src="js/bootstrap-3.1.1.min.js"></script>
<script type="text/javascript" src="js/bootstrap-multiselect.js"></script>
</head>
<body>
<form id="form1">
<div style="padding:20px">
<select id="chkveg" multiple="multiple">
<option value="cheese">Cheese</option>
<option value="tomatoes">Tomatoes</option>
<option value="mozarella">Mozzarella</option>
<option value="mushrooms">Mushrooms</option>
<option value="pepperoni">Pepperoni</option>
<option value="onions">Onions</option>
</select>
<br /><br />
<input type="button" id="btnget" value="Get Selected Values" />
<script type="text/javascript">
$(function() {
$('#chkveg').multiselect({
includeSelectAllOption: true
});
$('#btnget').click(function(){
alert($('#chkveg').val());
});
});
</script>
</div>
</form>
</body>
</html>
これがデモです
$(function() {
$('#chkveg').multiselect({
includeSelectAllOption: true
});
$('#btnget').click(function() {
alert($('#chkveg').val());
});
});
.multiselect-container>li>a>label {
padding: 4px 20px 3px 20px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://davidstutz.de/bootstrap-multiselect/dist/js/bootstrap-multiselect.js"></script>
<link href="https://davidstutz.de/bootstrap-multiselect/docs/css/bootstrap-3.3.2.min.css" rel="stylesheet"/>
<link href="https://davidstutz.de/bootstrap-multiselect/dist/css/bootstrap-multiselect.css" rel="stylesheet"/>
<script src="https://davidstutz.de/bootstrap-multiselect/docs/js/bootstrap-3.3.2.min.js"></script>
<form id="form1">
<div style="padding:20px">
<select id="chkveg" multiple="multiple">
<option value="cheese">Cheese</option>
<option value="tomatoes">Tomatoes</option>
<option value="mozarella">Mozzarella</option>
<option value="mushrooms">Mushrooms</option>
<option value="pepperoni">Pepperoni</option>
<option value="onions">Onions</option>
</select>
<br /><br />
<input type="button" id="btnget" value="Get Selected Values" />
</div>
</form>
以下のために純粋なCSSのアプローチは、使用することができます:checked
と組み合わせるセレクター::before
の条件付きコンテンツをインライン化するために、セレクタを。
要素にクラスselect-checkbox
を追加しselect
、次のCSSを含めるだけです。
.select-checkbox option::before {
content: "\2610";
width: 1.3em;
text-align: center;
display: inline-block;
}
.select-checkbox option:checked::before {
content: "\2611";
}
次のように、プレーンな古いユニコード文字(エスケープされた16進エンコーディング)を使用できます。
または、スパイスをかけたい場合は、これらのFontAwesomeグリフを使用できます
\f096
\f046
注:ただし、IEの互換性の問題に注意してください
multiple
属性が<select>
ドロップダウンではなくボックスのように見えると問題になります...
<select multiple>
要素に適用することです。そのため、それは意図されたユースケースである必要があります。あなたは適用することによって、個々の要素に使用することに決めたので、CSSセレクタは、そのクラスを適用するに特異的であるべきである.select-checkbox
クラスを
複数選択、特に複数アイテムを試してください。非常にクリーンで管理されたソリューションのように見えますが、多くの例があります。ソースを表示することもできます。
<div>
<div class="form-group row">
<label class="col-sm-2">
Basic Select
</label>
<div class="col-sm-10">
<select multiple="multiple">
<option value="1">1</option>
<option value="2">2</option>
</select>
</div>
</div>
<div class="form-group row">
<label class="col-sm-2">
Group Select
</label>
<div class="col-sm-10">
<select multiple="multiple">
<optgroup label="Group 1">
<option value="1">1</option>
<option value="2">2</option>
</optgroup>
<optgroup label="Group 2">
<option value="6">6</option>
<option value="7">7</option>
</optgroup>
<optgroup label="Group 3">
<option value="11">11</option>
<option value="12">12</option>
</optgroup>
</select>
</div>
</div>
</div>
<script>
$(function() {
$('select').multipleSelect({
multiple: true,
multipleWidth: 60
})
})
</script>
私は@vitfoの回答から始めましたが、チェックボックス入力ではなく<option>
内部にしたい<select>
ので、すべての回答をまとめてこれを作成します。私のコードがあり、誰かの助けになることを願っています。
$(".multiple_select").mousedown(function(e) {
if (e.target.tagName == "OPTION")
{
return; //don't close dropdown if i select option
}
$(this).toggleClass('multiple_select_active'); //close dropdown if click inside <select> box
});
$(".multiple_select").on('blur', function(e) {
$(this).removeClass('multiple_select_active'); //close dropdown if click outside <select>
});
$('.multiple_select option').mousedown(function(e) { //no ctrl to select multiple
e.preventDefault();
$(this).prop('selected', $(this).prop('selected') ? false : true); //set selected options on click
$(this).parent().change(); //trigger change event
});
$("#myFilter").on('change', function() {
var selected = $("#myFilter").val().toString(); //here I get all options and convert to string
var document_style = document.documentElement.style;
if(selected !== "")
document_style.setProperty('--text', "'Selected: "+selected+"'");
else
document_style.setProperty('--text', "'Select values'");
});
:root
{
--text: "Select values";
}
.multiple_select
{
height: 18px;
width: 90%;
overflow: hidden;
-webkit-appearance: menulist;
position: relative;
}
.multiple_select::before
{
content: var(--text);
display: block;
margin-left: 5px;
margin-bottom: 2px;
}
.multiple_select_active
{
overflow: visible !important;
}
.multiple_select option
{
display: none;
height: 18px;
background-color: white;
}
.multiple_select_active option
{
display: block;
}
.multiple_select option::before {
content: "\2610";
}
.multiple_select option:checked::before {
content: "\2611";
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="myFilter" class="multiple_select" multiple>
<option>A</option>
<option>B</option>
<option>C</option>
<option>D</option>
<option>E</option>
</select>
チェックボックスを非表示にするために外側をクリックする代替のバニラJSバージョン:
let expanded = false;
const multiSelect = document.querySelector('.multiselect');
multiSelect.addEventListener('click', function(e) {
const checkboxes = document.getElementById("checkboxes");
if (!expanded) {
checkboxes.style.display = "block";
expanded = true;
} else {
checkboxes.style.display = "none";
expanded = false;
}
e.stopPropagation();
}, true)
document.addEventListener('click', function(e){
if (expanded) {
checkboxes.style.display = "none";
expanded = false;
}
}, false)
キャプチャ/バブリングフェーズオプションとstopPropagation()を利用するために、onClickではなくaddEventListenerを使用しています。キャプチャ/バブルの詳細については、https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListenerをご覧ください。
コードの残りの部分はvitfoの元の回答と一致します(ただし、htmlのonclick()は不要です)。数人がjQueryではなくこの機能を要求しました。
これがコードペンの例ですhttps://codepen.io/davidysoards/pen/QXYYYa?editors=1010
この目的のためにgitでこのライブラリを使用できます https://github.com/ehynds/jquery-ui-multiselect-widget
selectboxを開始するには、これを使用します
$("#selectBoxId").multiselect().multiselectfilter();
(ajaxまたは任意のメソッドからの)jsonでデータの準備ができたら、最初にデータを解析してからjs配列をそれに割り当てます
var js_arr = $.parseJSON(/*data from ajax*/);
$("#selectBoxId").val(js_arr);
$("#selectBoxId").multiselect("refresh");
オプションメニューのチェックボックスリストにこのコードを使用します。
.dropdown-menu input {
margin-right: 10px;
}
<div class="btn-group">
<a href="#" class="btn btn-primary"><i class="fa fa-cogs"></i></a>
<a href="#" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</a>
<ul class="dropdown-menu" style="padding: 10px" id="myDiv">
<li><p><input type="checkbox" value="id1" > OA Number</p></li>
<li><p><input type="checkbox" value="id2" >Customer</p></li>
<li><p><input type="checkbox" value="id3" > OA Date</p></li>
<li><p><input type="checkbox" value="id4" >Product Code</p></li>
<li><p><input type="checkbox" value="id5" >Name</p></li>
<li><p><input type="checkbox" value="id6" >WI Number</p></li>
<li><p><input type="checkbox" value="id7" >WI QTY</p></li>
<li><p><input type="checkbox" value="id8" >Production QTY</p></li>
<li><p><input type="checkbox" value="id9" >PD Sr.No (from-to)</p></li>
<li><p><input type="checkbox" value="id10" > Production Date</p></li>
<button class="btn btn-info" onClick="showTable();">Go</button>
</ul>
</div>
dropdown-menu
各行にチェックボックス要素を使用してを作成するこの基本的なアプローチの完全に具体化された例については、ブートストラップドロップダウンにチェックボックスを配置する
オプションリストがAJAX呼び出しで更新される前にmultiselect.jsファイルをロードしている可能性があります。そのため、multiselect.jsファイルの実行中に、空のオプションリストがあり、multiselect functionlaityを適用します。したがって、まずAJAX呼び出しでオプションリストを更新してから、複数選択呼び出しを開始すると、動的オプションリストを含むドロップダウンリストが表示されます。
これがあなたを助けることを願っています。
// This function should be called while loading page
var loadParentTaskList = function(){
$.ajax({
url: yoururl,
method: 'POST',
success: function(data){
// To add options list coming from AJAX call multiselect
for (var field in data) {
$('<option value = "'+ data[field].name +'">' + data[field].name + '</option>').appendTo('#parent_task');
}
// To initiate the multiselect call
$("#parent_task").multiselect({
includeSelectAllOption: true
})
}
});
}
// Multiselect drop down list with id parent_task
<select id="parent_task" multiple="multiple">
</select>
Bootstrap-selectを試すことができます。ライブ検索もあります!
同じページに複数の選択ドロップダウンを作成する場合:
.multiselect {
width: 200px;
}
.selectBox {
position: relative;
}
.selectBox select {
width: 100%;
font-weight: bold;
}
.overSelect {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
}
#checkboxes {
display: none;
border: 1px #dadada solid;
}
#checkboxes label {
display: block;
}
#checkboxes label:hover {
background-color: #1e90ff;
}
HTML:
<form>
<div class="multiselect">
<div class="selectBox" onclick="showCheckboxes()">
<select>
<option>Select an option</option>
</select>
<div class="overSelect"></div>
</div>
<div id="checkboxes">
<label for="one">
<input type="checkbox" id="one" />First checkbox</label>
<label for="two">
<input type="checkbox" id="two" />Second checkbox</label>
<label for="three">
<input type="checkbox" id="three" />Third checkbox</label>
</div>
</div>
<div class="multiselect">
<div class="selectBox" onclick="showCheckboxes()">
<select>
<option>Select an option</option>
</select>
<div class="overSelect"></div>
</div>
<div id="checkboxes">
<label for="one">
<input type="checkbox" id="one" />First checkbox</label>
<label for="two">
<input type="checkbox" id="two" />Second checkbox</label>
<label for="three">
<input type="checkbox" id="three" />Third checkbox</label>
</div>
</div>
</form>
Jqueryを使用:
function showCheckboxes(elethis) {
if($(elethis).next('#checkboxes').is(':hidden')){
$(elethis).next('#checkboxes').show();
$('.selectBox').not(elethis).next('#checkboxes').hide();
}else{
$(elethis).next('#checkboxes').hide();
$('.selectBox').not(elethis).next('#checkboxes').hide();
}
}
クラスcreate divとクラスform-controlのみを追加します。iamはJSP、boostrap4を使用します。c:foreachは無視してください。
<div class="multi-select form-control" style="height:107.292px;">
<div class="checkbox" id="checkbox-expedientes">
<c:forEach var="item" items="${postulantes}">
<label class="form-check-label">
<input id="options" class="postulantes" type="checkbox" value="1">Option 1</label>
</c:forEach>
</div>
</div>