/* jQuery Nice Select - v1.1.0 https://github.com/hernansartorio/jquery-nice-select Made by HernĂ¡n Sartorio */ ( function ( $ ) { $.fn.niceSelect = function ( method ) { // Methods if ( typeof method == 'string' ) { if ( method == 'update' ) { this.each( function () { var $select = $( this ); var $dropdown = $( this ).next( '.nice-select' ); var open = $dropdown.hasClass( 'open' ); if ( $dropdown.length ) { $dropdown.remove(); create_nice_select( $select ); if ( open ) { $select.next().trigger( 'click' ); } } } ); } else if ( method == 'destroy' ) { this.each( function () { var $select = $( this ); var $dropdown = $( this ).next( '.nice-select' ); if ( $dropdown.length ) { $dropdown.remove(); $select.css( 'display', '' ); } } ); if ( $( '.nice-select' ).length == 0 ) { $( document ).off( '.nice_select' ); } } else { console.log( 'Method "' + method + '" does not exist.' ) } return this; } // Hide native select this.hide(); // Create custom markup this.each( function () { var $select = $( this ); if ( !$select.next().hasClass( 'nice-select' ) ) { create_nice_select( $select ); } } ); function create_nice_select ( $select ) { $select.after( $( '
' ) .addClass( 'nice-select' ) .addClass( $select.attr( 'class' ) || '' ) .addClass( $select.attr( 'disabled' ) ? 'disabled' : '' ) .addClass( $select.attr( 'multiple' ) ? 'has-multiple' : '' ) .attr( 'tabindex', $select.attr( 'disabled' ) ? null : '0' ) .html( $select.attr( 'multiple' ) ? '' : '' ) ); var $dropdown = $select.next(); var $options = $select.find( 'option' ); if ( $select.attr( 'multiple' ) ) { var $selected = $select.find( 'option:selected' ); var $selected_html = ''; $selected.each( function () { $selected_option = $( this ); $selected_text = $selected_option.data( 'display' ) || $selected_option.text(); $selected_html += '' + $selected_text + ''; } ); $select_placeholder = $select.data( 'placeholder' ) || $select.attr( 'placeholder' ); $select_placeholder = $select_placeholder == '' ? 'Select' : $select_placeholder; $selected_html = $selected_html == '' ? $select_placeholder : $selected_html; $dropdown.find( '.multiple-options' ).html( $selected_html ); } else { var $selected = $select.find( 'option:selected' ); $dropdown.find( '.current' ).html( $selected.data( 'display' ) || $selected.text() ); } $options.each( function ( i ) { var $option = $( this ); var display = $option.data( 'display' ); $dropdown.find( 'ul' ).append( $( '
  • ' ) .attr( 'data-value', $option.val() ) .attr( 'data-display', ( display || null ) ) .addClass( 'option' + ( $option.is( ':selected' ) ? ' selected' : '' ) + ( $option.is( ':disabled' ) ? ' disabled' : '' ) ) .html( $option.text() ) ); } ); } /* Event listeners */ // Unbind existing events in case that the plugin has been initialized before $( document ).off( '.nice_select' ); // Open/close $( document ).on( 'click.nice_select', '.nice-select', function ( event ) { var $dropdown = $( this ); $( '.nice-select' ).not( $dropdown ).removeClass( 'open' ); $dropdown.toggleClass( 'open' ); if ( $dropdown.hasClass( 'open' ) ) { $dropdown.find( '.option' ); $dropdown.find( '.nice-select-search' ).val( '' ); $dropdown.find( '.nice-select-search' ).focus(); $dropdown.find( '.focus' ).removeClass( 'focus' ); $dropdown.find( '.selected' ).addClass( 'focus' ); $dropdown.find( 'ul li' ).show(); } else { $dropdown.focus(); } } ); $( document ).on( 'click', '.nice-select-search-box', function ( event ) { event.stopPropagation(); return false; } ); $( document ).on( 'keyup.nice-select-search', '.nice-select', function () { var $self = $( this ); var $text = $self.find( '.nice-select-search' ).val(); var $options = $self.find( 'ul li' ); if ( $text == '' ) $options.show(); else if ( $self.hasClass( 'open' ) ) { $text = $text.toLowerCase(); var $matchReg = new RegExp( $text ); if ( 0 < $options.length ) { $options.each( function () { var $this = $( this ); var $optionText = $this.text().toLowerCase(); var $matchCheck = $matchReg.test( $optionText ); $matchCheck ? $this.show() : $this.hide(); } ) } else { $options.show(); } } $self.find( '.option' ), $self.find( '.focus' ).removeClass( 'focus' ), $self.find( '.selected' ).addClass( 'focus' ); } ) // Close when clicking outside $( document ).on( 'click.nice_select', function ( event ) { if ( $( event.target ).closest( '.nice-select' ).length === 0 ) { $( '.nice-select' ).removeClass( 'open' ).find( '.option' ); } } ); // Option click $( document ).on( 'click.nice_select', '.nice-select .option:not(.disabled)', function ( event ) { var $option = $( this ); var $dropdown = $option.closest( '.nice-select' ); if ( $dropdown.hasClass( 'has-multiple' ) ) { if ( $option.hasClass( 'selected' ) ) { $option.removeClass( 'selected' ); } else { $option.addClass( 'selected' ); } $selected_html = ''; $selected_values = []; $dropdown.find( '.selected' ).each( function () { $selected_option = $( this ); var text = $selected_option.data( 'display' ) || $selected_option.text() $selected_html += '' + text + ''; $selected_values.push( $selected_option.data( 'value' ) ); } ); $select_placeholder = $dropdown.prev( 'select' ).data( 'placeholder' ) || $dropdown.prev( 'select' ).attr( 'placeholder' ); $select_placeholder = $select_placeholder == '' ? 'Select' : $select_placeholder; $selected_html = $selected_html == '' ? $select_placeholder : $selected_html; $dropdown.find( '.multiple-options' ).html( $selected_html ); $dropdown.prev( 'select' ).val( $selected_values ).trigger( 'change' ); } else { $dropdown.find( '.selected' ).removeClass( 'selected' ); $option.addClass( 'selected' ); var text = $option.data( 'display' ) || $option.text(); $dropdown.find( '.current' ).text( text ); $dropdown.prev( 'select' ).val( $option.data( 'value' ) ).trigger( 'change' ); } } ); // Keyboard events $( document ).on( 'keydown.nice_select', '.nice-select', function ( event ) { var $dropdown = $( this ); var $focused_option = $( $dropdown.find( '.focus' ) || $dropdown.find( '.list .option.selected' ) ); // Space or Enter if ( event.keyCode == 32 || event.keyCode == 13 ) { if ( $dropdown.hasClass( 'open' ) ) { $focused_option.trigger( 'click' ); } else { $dropdown.trigger( 'click' ); } return false; // Down } else if ( event.keyCode == 40 ) { if ( !$dropdown.hasClass( 'open' ) ) { $dropdown.trigger( 'click' ); } else { var $next = $focused_option.nextAll( '.option:not(.disabled)' ).first(); if ( $next.length > 0 ) { $dropdown.find( '.focus' ).removeClass( 'focus' ); $next.addClass( 'focus' ); } } return false; // Up } else if ( event.keyCode == 38 ) { if ( !$dropdown.hasClass( 'open' ) ) { $dropdown.trigger( 'click' ); } else { var $prev = $focused_option.prevAll( '.option:not(.disabled)' ).first(); if ( $prev.length > 0 ) { $dropdown.find( '.focus' ).removeClass( 'focus' ); $prev.addClass( 'focus' ); } } return false; // Esc } else if ( event.keyCode == 27 ) { if ( $dropdown.hasClass( 'open' ) ) { $dropdown.trigger( 'click' ); } // Tab } else if ( event.keyCode == 9 ) { if ( $dropdown.hasClass( 'open' ) ) { return false; } } } ); // Detect CSS pointer-events support, for IE <= 10. From Modernizr. var style = document.createElement( 'a' ).style; style.cssText = 'pointer-events:auto'; if ( style.pointerEvents !== 'auto' ) { $( 'html' ).addClass( 'no-csspointerevents' ); } return this; }; }( jQuery ) );