Basic Settings
Support both single and multiple select.
single select
- single select
-
- similar to HTML select
- can only select one option
- by default, closed after selection
- configurable display label
- stylish button through configuration
$("select#demo-1a").smartselect({ multiple: false, style: { select: 'dropdown-toggle btn btn-info' }, text: { selectLabel: 'Select ...' }, toolbar: false });
default values
- multiple select
-
- if multiple attribute set in <SELECT>
- by default, dropdown wouldn't close after selction
- default values
-
- configurable default values
- when all options deselected, plugin will be reset to default values
- initial values
-
- If original <SELECT> has options selected, plugin will be inited with these values
- Initial values can also be set with options
- plugin will not be reset to initial values when all options deselected
$("select#demo-1b").smartselect({ defaultValues: [ '3', '6' ], toolbar: false });
limit selections
- atLeast
-
- atLeast limits the minimum options required in the <SELECT>
- user may defined a handler to listen to the atLeast event
- in <OPTGROUP>, attribute 'data-atleast' can be used to set minimum required selected options in a optgroup
- atMost
-
- atMost limits the maximum options allowed in the <SELECT>
- user may defined a handler to listen to the atMost event
- in <OPTGROUP>, attribute 'data-atmost' can be used to set maximum selected options allowed in a optgroup
- mustSelect
-
- mustSelect contains an array of values must be selected in <SELECT>
- user may defined a handler to listen to the mustSelect event
- attribute data-must can used in <OPTION> to achieve same purpose
$("select#demo-1c").smartselect({ atLeast: 2, atMost: 4, mustSelect: [ '1' ], toolbar: false, handler: { atLeast: function() { alert('at least 2 options required'); }, atMost: function() { alert('maximum 4 options exceeded'); }, mustSelect: function() { alert('must select this one'); } } });
data exclusive
- data exclusive
-
- data-exclusive and data-inclusive can be combined to achieve complex data relationships in <SELECT> or <OPTGROUP>
- data-exclusive defines options exlusive with others in a multiple select situation, similar to a single select
- data inclusive
-
- data-inclusive attribute used in <OPTION> defines options can be selected together with other options in the same 'team'
- data-inclusive attribute value is a space-seperated string with each non-space char indicate a different 'team'
<select id="demo-1d" multiple data-exclusive> <option value="1">label 1</option> <option value="2" data-inclusive="a b">label 2 (team a & b)</option> <option value="3" data-inclusive="b c">label 3 (team b & c)</option> <option value="4">label 4</option> <option value="5">label 5</option> <option value="6" data-inclusive="c">label 6 (team c)</option> <option value="7">label 7</option> <option value="8">label 8</option> </select> $("select#demo-1d").smartselect({ showSelectedCount: 1, toolbar: false });
The Toolbar
search & unfold
- buttonSearch
-
- search all options
- search by 'label', 'value' or 'both'
- hit RETURN in the input box to search
- better use with unfold button to view unfiltered options
- buttonUnfold
-
- expanded view to show all options
- in <OPTGROUP> or data-level cases, expand all groups and levels
$("select#demo-2a").smartselect({ searchBy: 'label', searchCaseInsensitive: false, toolbar: { buttonSearch: true, buttonAlias: false, buttonView: false, buttonUnfold: true, buttonCancel: false, buttonCheckAll: false, buttonUnCheck: false } });
aliases
- buttonAlias
-
- save selected options as an alias for quick access at later time
- select multiple options by just clikc an alias name
- different aliases must use different names
- a new alias name for the same selected options will overwrite the old alias
- default to close the select after click an alias
- status change event 'aliasChange' triggered once an alias is added/deleted
- aliases can be easily defined initially or added later
$("select#demo-2b").smartselect({ viewAfterAlias: false, closeAfterAlias: false, handler: { aliasChange: function() { console.log('alias changed'); } }, aliases: { alias1: [ '1' , '2' ], alias2: [ '5' , '7' ] }, toolbar: { buttonSearch: true, buttonAlias: true, buttonView: false, buttonUnfold: true, buttonCancel: false, buttonCheckAll: false, buttonUnCheck: false } });
view & unfold
- buttonView
-
- defines a fold/unfold status when click buttonView
- possible values are root, expand, level1, level2 and selected
- selected can be combined with other options, like root+selected
- defaultView
-
- defines the fold/unfold status before dropdown shows for the first time
- attribute data-view can be added to <OPTGROUP> or <OPTION> to enable default fold/unfold status for specific group or level
$("select#demo-2c").smartselect({ defaultView: 'selected', toolbar: { buttonSearch: true, buttonAlias: true, // view selected options only when clicked buttonView: 'selected', buttonUnfold: true, buttonCancel: false, buttonCheckAll: false, buttonUnCheck: false } });
check all
- buttonCheckAll
-
- select all options
- for complex situation, simulates click group by group
- buttonUnCheck
-
- deselect all options
- unless atLeast, defaultValues are set
$("select#demo-2d").smartselect({ toolbar: { buttonSearch: true, buttonAlias: true, buttonView: 'selected', buttonUnfold: true, buttonCancel: false, buttonCheckAll: true, buttonUnCheck: true } });
cancel
- buttonCancel
-
- revert to the status when dropdown just showed
$("select#demo-2e").smartselect({ viewAfterCancel: false, toolbar: { buttonSearch: true, buttonAlias: true, buttonView: 'selected', buttonUnfold: true, buttonCancel: true, buttonCheckAll: true, buttonUnCheck: true } });
toolbar position
- move toolbar to left
-
- change the style of toolbarPos
- change the style of dropdown in toolbar
$("select#demo-2f").smartselect({ style: { buttonDropdown: 'dropdown-menu', toolbarPos: 'left' } });
Option Group
data-level
- data-level
-
- data-level attribute is used to indicate option level
- by default, when no data-level is specified, it equals to data-level="1"
- by default, click a sublevel will deselect the upper levels, vise versa.
- by default, when all sublevels selected, it will revert to one level up
- buttonCheckAll just select all of the level 1 under the group
$("select#demo-3a").smartselect({ defaultView: 'expand' });
default view
- defaultView
-
- control default fold/unfold status by using defaultView option and data-view attribute
- defualtView defines overall expand level while data-view controls individual group or level
- data-view="2" means expand upto 2 levels under this group/level
<optgroup label="group 1" data-view="1"> <option value="1">label 1</option> <option value="1-1" data-level="2">label 1-1</option> <option value="1-2" data-level="2">label 1-2</option> <option value="2">label 2</option> ... $("select#demo-3b").smartselect({ defaultView: 'root+selected' });
group exclusive
- data-group-exclusive
-
- when data-group-exclusive attribute set, this group will exclusive with other groups
- data-group-exclusive can take a spaced string, "a b" means other groups with "a" or "b" will not be exclusive with this group
- empty data-group-exclusive means data-group-exclusive="_"
- when no attribute data-group-exclusiveset, equals to data-group-exclusive="."
<select id="demo-3c" multiple> <optgroup label="group 1" data-group-exclusive> <option value="1">1</option> <option value="2">2</option> </optgroup> <optgroup label="group a b" data-group-exclusive="a b"> <option value="3">3</option> <option value="4">4</option> </optgroup> <optgroup label="group b c" data-group-exclusive="b c"> <option value="5">5</option> <option value="6">6</option> </optgroup> <optgroup label="group c" data-group-exclusive="c"> <option value="7">7</option> <option value="8">8</option> </optgroup> <optgroup label="group 5"> <option value="9">9</option> <option value="10">10</option> </optgroup> </select>
limit in group
- data-atleast
-
- set at least number of options required at group level
- plugin will select the at least number of options if no default values or initial values set
- status change event atLeast will be triggered if user deselect at least number of options
- data-atmost
-
- set maximum number of options allowed at group level
- if default values or initial values exceend the data-atmost, event 'atMost' will be triggered
<select id="demo-3d" multiple> <optgroup label="group 1" data-view data-atleast="1"> <option value="1" data-must>1</option> <option value="2">2</option> <option value="3">3</option> </optgroup> <optgroup label="group 2" data-atleast="2" data-atmost="3"> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> </optgroup> </select>
APIs
common apis
- toggle, select, deselect & get
-
- toggleDropdown() toggles the dropdown
- selectOptions(array values, clear = true) select values, clear first by default
- deselectOptions(array values) deselect values
- getValues() get all selection values in array
- click buttons below
var $ss4a = $("select#demo-4a").smartselect({ defaultView: 'expand' }).getsmartselect(); // toggle dropdown $("#btn-4aa").click(function() { $ss4a.toggleDropdown(); }); // set values without clear $("#btn-4ab").click(function() { $ss4a.selectOptions([ '3', '4' ], false); }); // unset values $("#btn-4ac").click(function() { $ss4a.deselectOptions([ '3' ]); }); // get values $("#btn-4ad").click(function() { alert($ss4a.getValues()); }); // clear all values $("#btn-4ae").click(function() { $ss4a.selectOptions([ ]); });
disable & enable
- disable & enable
-
- disableOptions(array values) disable options base on given values, if no values provided, disable all options
- enableOptions(array values) enable options base on given values. If no values provided, enable all disabled options
- disableSelect() disables the select entirely
- enableSelect() enables the select
- click buttons below
var $ss4b = $("select#demo-4b").smartselect({ defaultView: 'expand' }).getsmartselect(); // toggle dropdown $("#btn-4ba").click(function() { $ss4b.toggleDropdown(); }); // disable values $("#btn-4bb").click(function() { $ss4b.disableOptions(); }); // enable values $("#btn-4bc").click(function() { $ss4b.enableOptions([ '3', '4' ]); }); // enable all $("#btn-4bd").click(function() { $ss4b.enableOptions(); }); // get values $("#btn-4be").click(function() { alert($ss4b.getValues()); }); // disable select $("#btn-4bf").click(function() { $ss4b.disableSelect(); }); // enable select $("#btn-4bg").click(function() { $ss4b.enableSelect(); });
add & remove options
- addOption(info, after, parent)
-
- 'info' is an object has 'info.label' and 'info.value' set.
- 'after' is an option value, DOM or jQuery object.
- 'parent' can be an option value, DOM, jQuery object or a group name to match
- removeOption(value)
-
- 'value' can be an option value, DOM or jQuery object.
- click buttons below
var $ss4c = $("select#demo-4c").smartselect({ defaultView: 'expand' }).getsmartselect(); // add 9 after 8 $("#btn-4ca").click(function() { $ss4c.toggleDropdown(false); $ss4c.addOption({ label: '9', value: '9' }, '8'); }); // add 10 under 8 $("#btn-4cb").click(function() { $ss4c.addOption({ label: '10', value: '10' }, false, '8'); }); // just add to the group 1 $("#btn-4cc").click(function() { $ss4c.addOption({ label: '11', value: '11' }, false, $ss4c.getGroup('group 1')); }); // just add to the root end $("#btn-4cd").click(function() { $ss4c.addOption({ label: '12', value: '12' }); }); $(document).on('optionDuplicated.pa.smartselect', function(e) { $ss4c.removeOption(e.target); }); // get values $("#btn-4ch").click(function() { alert($ss4c.getValues()); });
work with alias
- addAlias(name, value)
-
- 'name' is a string.
- 'value' is an array of values.
- removeAlias(name)
-
- 'name' is a string.
- click buttons below
var $ss4d = $("select#demo-4d").smartselect({ defaultView: 'expand', closeAfterAlias: false }).getsmartselect(); // add alias 'test' function xx() { $ss4d.$buttonAlias.find('button').trigger('click'); } $("#btn-4da").click(function() { $ss4d.toggleDropdown(); setTimeout(xx, 100); $ss4d.addAlias('test', [ '3', '5' ]); }); $("#btn-4db").click(function() { $ss4d.selectAlias('test'); setTimeout(xx, 100); }); $("#btn-4dc").click(function() { $ss4d.removeAlias('test'); });
Events
status events
- status change events
-
- signal a status change
- no 'on' prefix in the event name, like 'atLeast', 'atMost' etc.
- handlers can be defined outside with fullname like 'atLeast.pa.smartselect'
- handlers can also be defined in initial options, with shortname like 'atLeast'
- status change events triggered on related jQ object
- or when no object to be associated with, triggered on this.$element
$(document).on('aliasChange.pa.smartselect', function() { alert('handler defined outside'); }); var $ss5a = $('select#demo-5a').smartselect({ aliases: { test: [ '3', '4' ] }, handler: { aliasChange: function(e) { alert('handler defined in options'); } } }).getsmartselect(); var removeIt = function() { $ss5a.removeAlias('test'); }; $('#btn-5aa').click(function() { $ss5a.toggleDropdown(false).$buttonAlias.find('button').trigger('click'); setTimeout(removeIt, 900); });
procedural events
- procedural events
-
- events triggered in procedures
- 'on' prefix in the event name, like 'onPluginLoaded' etc.
- procedural events normally come in pairs like 'onOptionChange' (before) and 'onOptionChanged' (after)
- callbacks can defined in initial options
- callbacks can also be added later on with API 'addCallback()'
- callbacks are required to return true or false base on execution status.
- if a before-procedure callback returns false, the whole procedure will stop
var d3 = function($target, event) { if ($target.attr('data-value') === '3') { alert('you can not select 3'); return false; } return true; }; var $ss5b = $('select#demo-5b').smartselect({ callback: { onOptionSelect: [ d3 ] }, toolbar: false }).getsmartselect(); $('#btn-5ba').click(function() { $ss5b.toggleDropdown(false); $ss5b.selectOption('3'); }); $('#btn-5bb').click(function() { $ss5b.toggleDropdown(false); $ss5b.selectOption('2'); }); $ss5b.addCallback('onOptionSelected', function($target, event) { alert('you selected ' + $target.attr('data-value')); });
callback example 1
- onOptionSelected
-
- triggered after option sucessfully selected
- onOptionDeselected
-
- triggered after option sucessfully deselected
var addButton = function($target, event) { var self = this; var html = '<button type="button" class="btn btn-sm btn-info" data-value="' + $target.attr('data-value') + '">' + $target.text() + '<i class="fa fa-times"></i></button>'; $('#pool').append(html); $('#pool').find('button').off().on('click', function(e) { var v = $(e.target).closest('button').attr('data-value'); self.deselectOptions([ v ]); }); return true; }; var removeButton = function($target, event) { $('#pool').find('button').each(function() { if ($(this).attr('data-value') === $target.attr('data-value')) { $(this).remove(); return false; } }); return true; }; $('select#demo-5c').smartselect({ defaultView: 'expand', toolbar: false, callback: { onOptionSelected: [ addButton ], onOptionDeselected: [ removeButton ] } });
callback example 2
- Disable options base on selection
-
- on option select, call predefined callbacks.
var exOne = function($target, event) { var val = $target.attr('data-value'); if (val === 'male') { // always enable first this.enableOptions([ 'decathlon' ]); this.disableOptions([ 'heptathlon', 'synchronized Swimming' ]); } if (val === 'female') { this.enableOptions([ 'heptathlon', 'synchronized Swimming' ]); this.disableOptions([ 'decathlon' ]); } return true; }; $('select#demo-5d').smartselect({ defaultView: 'expand', toolbar: false, callback: { onOptionSelect: [ exOne ] } });
Advanced
special options
- input box as an option
-
- all kinds of components can be used as an option
- As long as the option is marked as data-special
- and three callbacks getSpecialValue(), setSpecialValue(), getSpecialLabel() defined.
- class ss-nobubble to disable click event bubble up to <li>
$(document).ready(function() { var $ss6a = $('#demo-6a').smartselect({ defaultView: 'level1+selected', initialValues: [ '1//testInput', '2-1' ], specialValueSeperator: '//', aliases: { 'Special Option': [ '1//testInput', '2-1' ] }, callback: { onOptionSelect: [ // if inputbox has no value, disable select function($target, event) { if ($target.find('input').val() === '') return false; return true; } ] }, data: [ { group: true, label: 'Group One' }, { value: '1', 'data-special': true, html: '<label class="ss-nobubble"><input type="text" placeholder="Please type" id="test6" class="form-control input-sm"></label>' }, { value: '2', label: '2' }, { value: '2-1', label: '2-1', level: 2 }, { value: '3', label: '3' }, { group: true, label: 'Group Two' }, { value: '4', label: '4' }, { value: '5', label: '5' }, { value: '6', label: '6' } ]}).getsmartselect(); // select if inputbox has value, unselect if inputbox empty $("#test6").on("focusout", function(e) { var $jq = $(this); var val = $jq.val(); if (val === "") { $ss6a.deselectOptions([ '1' ]); } else { $ss6a.selectOption([ '1' ]); } }); });