Reputation: 820
I want user to select maximum of only three options from multiple select options. I tried this code so far:
<select id="userRequest_activity" required name="activity[]" class="multiselect form-control" multiple="multiple">
<option value="2">Bungee Jumping</option>
<option value="3">Camping</option>
<option value="5">Mountain Biking</option>
<option value="6">Rappelling</option>
<option value="7">Rock Climbing / Bouldering</option>
<option value="8">Skiing</option>
<option value="10">Wild Life (Safari)</option>
<option value="11">Canoeing & Kayaking</option>
<option value="12">Rafting</option>
<option value="13">Sailing</option>
<option value="14">Scuba Diving</option>
<option value="15">Snorkeling</option>
<option value="16">Surfing</option>
<option value="18">Hang Gliding</option>
<option value="19">Hot-air Ballooning</option>
<option value="20">Micro-light Aircrafts</option>
<option value="21">Paragliding</option>
<option value="22">Paramotoring</option>
<option value="23">Parasailing</option>
<option value="24">Skydiving / Parachuting</option>
<option value="25">Zip-line / Flying Fox</option>
<option value="26">Caving</option>
<option value="27">Cycling</option>
<option value="28">Fishing & Angling</option>
<option value="29">Motorbike trips</option>
<option value="30">Nature Walks</option>
<option value="31">Road Trips</option>
<option value="32">Zorbing</option>
<option value="33">Trekking Hiking and Mountaineering</option>
<option value="34">Backpacking</option>
<option value="61">Water</option>
</select>
The javascript code:
<script type="text/javascript">
$("select").change(function() {
if ($("select option:selected").length > 3) {
$(this).removeAttr("selected");
alert('You can select upto 3 options only');
}
});
</script>
This code shows the alert box when selected more than 3 options but still allow access to select the 4th, 5th, 6th and so on selections with the alert box appearing. How to validate this?
Upvotes: 21
Views: 85971
Reputation: 1
This is a custom solution I built (in the Bootstrap ecosystem.) It will disable all non-selected options in the dropdown, and re-enable them when you de-select an option.
I modulated it to a function so you can easily pass your own identifier. These loops can almost certainly be optimized, but I'll leave that to the reader.
<select id="my_select" class="selectpicker form-control filter-select modal-filter-dropdown" data-width = "100%" multiple>
<option class="dropdown-item" href="#">Clear Selected Items</option>
<option class="dropdown-item" href="#">Another action</option>
<option class="dropdown-item" href="#">Something else here</option>
<option class="dropdown-item" href="#">Link 1</option>
<option class="dropdown-item" href="#">Link 2</option>
<option class="dropdown-item" href="#">Link 3</option>
<option class="dropdown-item" href="#">Link 4</option>
<option class="dropdown-item" href="#">Link 5</option>
<option class="dropdown-item" href="#">Link 6</option>
<option class="dropdown-item" href="#">Link 7</option>
</select>
<script type='text/javascript'>
$(document).ready(function() {
selectWithLimit("#my_select", 3);
function selectWithLimit(selector, selection_limit) {
let num_selected = 0;
// count number of selected options
$(selector).change(function(event) {
$(selector + ' option').each(function() {
if($(this).is(':selected')) {
num_selected++;
}
});
// disable each option that is not selected if we're over the limit
if (num_selected >= selection_limit) {
$(selector + ' option').each(function() {
if (!$(this).is(':selected')) {
if ($(this).val() != "Clear Selected Items") {
$(this).prop("disabled", true);
}
}
});
// otherwise, enable all options
} else {
$(selector + ' option').each(function() {
if (!$(this).is(':selected')) {
$(this).prop("disabled", false);
}
});
}
$('.selectpicker').selectpicker('refresh');
num_selected = 0;
});
}
});
</script>
Upvotes: 0
Reputation: 1
Try this, it worked for me and it's simple, it show an alert and remove one selected option.
<script>
(function() {
var x= document.getElementById("select");
x.addEventListener("click",function() {
var total = 0;
for (var i = 0; i < x.options.length; i++) {
if (x.options[i].selected == true) {
total = total + 1
}
}
if (total > 3) {
alert("please don't select more then 3 options")
x.options[x.options.selectedIndex].selected=false
}
});
})();
</script>
Upvotes: 0
Reputation: 10610
You can disable the unselected options once the user selected the maximum limit and enable them again when the total selection count goes below the maximum limit.
Here is the sample code,
function maxAllowedMultiselect(obj, maxAllowedCount) {
var selectedOptions = jQuery('#'+obj.id+" option[value!=\'\']:selected");
if (selectedOptions.length >= maxAllowedCount) {
if (selectedOptions.length > maxAllowedCount) {
selectedOptions.each(function(i) {
if (i >= maxAllowedCount) {
jQuery(this).prop("selected",false);
}
});
}
jQuery('#'+obj.id+' option[value!=\'\']').not(':selected').prop("disabled",true);
} else {
jQuery('#'+obj.id+' option[value!=\'\']').prop("disabled",false);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="userRequest_activity" name="activity[]" onchange="maxAllowedMultiselect(this, 2)" multiple>
<option value="1">Bungee Jumping</option>
<option value="2">Camping</option>
<option value="3">Mountain Biking</option>
<option value="4">Rappelling</option>
<option value="5">Rock Climbing / Bouldering</option>
<option value="6">Skiing</option>
<option value="7">Wild Life (Safari)</option>
<option value="8">Canoeing & Kayaking</option>
<option value="9">Rafting</option>
<option value="10">Sailing</option>
</select>
Upvotes: 3
Reputation: 87203
You are using this
inside change
event, which is reference to select
.
Try this:
$("select").on('click', 'option', function() {
if ($("select option:selected").length > 3) {
$(this).removeAttr("selected");
// alert('You can select upto 3 options only');
}
});
Demo: http://jsfiddle.net/tusharj/tmkzebnj/
EDIT
$("select").on('change', function(e) {
if (Object.keys($(this).val()).length > 3) {
$('option[value="' + $(this).val().toString().split(',')[3] + '"]').prop('selected', false);
}
});
Demo: http://jsfiddle.net/tusharj/tmkzebnj/1/
Upvotes: 7
Reputation: 5444
Try this...
Check length and deselect after reach maximum select
<select id="userRequest_activity" required name="activity[]" class="multiselect form-control" multiple="multiple">
<option value="2">Bungee Jumping</option>
<option value="3">Camping</option>
<option value="5">Mountain Biking</option>
<option value="6">Rappelling</option>
<option value="7">Rock Climbing / Bouldering</option>
<option value="8">Skiing</option>
<option value="10">Wild Life (Safari)</option>
<option value="11">Canoeing & Kayaking</option>
<option value="12">Rafting</option>
<option value="13">Sailing</option>
<option value="14">Scuba Diving</option>
<option value="15">Snorkeling</option>
<option value="16">Surfing</option>
<option value="18">Hang Gliding</option>
<option value="19">Hot-air Ballooning</option>
<option value="20">Micro-light Aircrafts</option>
<option value="21">Paragliding</option>
<option value="22">Paramotoring</option>
<option value="23">Parasailing</option>
<option value="24">Skydiving / Parachuting</option>
<option value="25">Zip-line / Flying Fox</option>
<option value="26">Caving</option>
<option value="27">Cycling</option>
<option value="28">Fishing & Angling</option>
<option value="29">Motorbike trips</option>
<option value="30">Nature Walks</option>
<option value="31">Road Trips</option>
<option value="32">Zorbing</option>
<option value="33">Trekking Hiking and Mountaineering</option>
<option value="34">Backpacking</option>
<option value="61">Water</option>
</select>
<script type="text/javascript">
$(document).ready(function() {
var last_valid_selection = null;
$('#userRequest_activity').change(function(event) {
if ($(this).val().length > 3) {
$(this).val(last_valid_selection);
} else {
last_valid_selection = $(this).val();
}
});
});
</script>
DEMO:http://jsfiddle.net/9c3sevuv/
Upvotes: 30
Reputation: 13474
Try this
$("select").change(function() {
if($("select option:selected").length > 3) {
alert('You can select upto 3 options only');
$(this).removeAttr("selected");
}
});
Upvotes: 0