change select values with jQuery

Asked

Viewed 1,560 times

0

Well the problem I’m having is that by clicking the button and changing the values of select, the effect is lost.

A new select appears and I need to change only the results and keep the style.

Does anyone know what it can be?

$("button").on("click", function() {

  $('#gostou').html('<option value="1">teste1</option>').show();
  
});







/*  jQuery Nice Select - v1.1.0
 https://github.com/hernansartorio/jquery-nice-select
 Made by Hernán Sartorio  */

(function($) {

  $.fn.niceSelect = function() {

    // 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($('<div></div>')
        .addClass('nice-select')
        .addClass($select.attr('class') || '')
        .addClass($select.attr('disabled') ? 'disabled' : '')
        .attr('tabindex', $select.attr('disabled') ? null : '0')
        .html('<span class="current"></span><ul class="list"></ul>')
      );

      var $dropdown = $select.next();
      var $options = $select.find('option');
      var $optgroups = $select.find('optgroup');
      var $selected = $select.find('option:selected');

      $dropdown.find('.current').html($selected.data('display') || $selected.text());

      $options.each(function() {
        var $option = $(this);
        var display = $option.data('display');
        var group = $option.parents('optgroup').data('i');

        $dropdown.find('ul').append($('<li></li>')
          .attr('data-value', $option.val())
          .attr('data-display', (display || null))
          .attr('data-group', (group || null))
          .addClass('option' +
            ($option.is(':selected') ? ' selected' : '') +
            ($option.is(':disabled') ? ' disabled' : ''))
          .html($option.text())
        );
      });
      $optgroups.each(function(i, g) {
        label = $(g).attr('label');
        $dropdown.find('ul li').filter(function() {
            return $(this).data('group') === $(g).data('i');
          })
          .wrapAll('<div class="optgroup"/>')
          .parent()
          .prepend('<span class="label">' + label + '</span>');
      });
    }

    /* 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() {
      var $dropdown = $(this);

      $('.nice-select').not($dropdown).removeClass('open');
      $dropdown.toggleClass('open');

      if ($dropdown.hasClass('open')) {
        $dropdown.find('.option');
        $dropdown.find('.focus').removeClass('focus');
        $dropdown.find('.selected').addClass('focus');
      } else {
        $dropdown.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');
      }
    });

    // Animation loading a page
    $('select').on('blur', function(e) {
      $(this).parents('.form-group-select').toggleClass('focused', (e.type === 'focus' || this.value !== ''));
    }).trigger('blur');

    // Option click
    $(document).on('click.nice_select', '.nice-select .option:not(.disabled)', function() {

      var $option = $(this);
      var $dropdown = $option.closest('.nice-select');

      $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');

      // Animation
      $(this).parents('.form-group-select').toggleClass('focused', ($option.data('value') !== ''));
    });

    // 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;
        }
      }
    });
    return this;
  };
}(jQuery));
$('select').niceSelect();
.control-label {
  pointer-events: none;
  position: absolute;
  transform: translate3d(5px, 22px, 0) scale(1);
  transform-origin: left top;
  transition: 240ms;
}

.form-group-select.focused .control-label {
  transform: scale(0.75);
}

.form-group-select {
  width: 100%;
  margin-top: 20px;
  position: relative;
  height: 45px;
  float: left;
}

.nice-select:before {
  width: 100%;
  height: 1px;
  background: #0091FF;
  position: absolute;
  left: 0;
  bottom: 0;
  content: '';
  transform: scaleX(0);
  transition: ease-in-out 240ms all;
}

.nice-select.open::before {
  transform: scaleX(1);
}

.nice-select {
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  clear: both;
  cursor: pointer;
  display: block;
  height: 42px;
  line-height: 40px;
  outline: none;
  position: relative;
  text-align: left !important;
  -webkit-transition: all 0.2s ease-in-out;
  transition: all 0.2s ease-in-out;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  white-space: nowrap;
  width: 100%;
  border: 0 solid #484848;
  border-bottom-width: 1px;
  margin-top: 3px;
}

.nice-select span {
  margin-left: 5px;
}

.optgroup span {
  padding-left: 10px;
  font-style: italic;
}

.nice-select:hover,
.nice-select:focus {
  border-color: #0091FF;
}

.nice-select:after {
  border-bottom: 2px solid #484848;
  border-right: 2px solid #484848;
  content: '';
  display: block;
  height: 5px;
  margin-top: -4px;
  pointer-events: none;
  position: absolute;
  right: 12px;
  top: 50%;
  -webkit-transform-origin: 66% 66%;
  -ms-transform-origin: 66% 66%;
  transform-origin: 66% 66%;
  -webkit-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
  -webkit-transition: all 0.15s ease-in-out;
  transition: all 0.15s ease-in-out;
  width: 5px;
}

.nice-select.open:after {
  -webkit-transform: rotate(-135deg);
  -ms-transform: rotate(-135deg);
  transform: rotate(-135deg);
}

.nice-select.open .list {
  color: #484848;
  opacity: 1;
  pointer-events: auto;
  -webkit-transform: scale(1) translateY(0);
  -ms-transform: scale(1) translateY(0);
  transform: scale(1) translateY(0);
}

.nice-select.disabled {
  border-color: #ededed;
  color: #999;
  pointer-events: none;
}

.nice-select.disabled:after {
  border-color: #cccccc;
}

.nice-select .list {
  background-color: #FFF;
  border-radius: 4px;
  box-sizing: border-box;
  margin-top: 4px;
  opacity: 0;
  overflow: hidden;
  padding: 0;
  pointer-events: none;
  position: absolute;
  top: 100%;
  left: 0;
  -webkit-transform-origin: 50% 0;
  -ms-transform-origin: 50% 0;
  transform-origin: 50% 0;
  -webkit-transform: scale(0.75) translateY(-21px);
  -ms-transform: scale(0.75) translateY(-21px);
  transform: scale(0.75) translateY(-21px);
  -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  width: 100%;
  z-index: 99;
}

.nice-select .list:before {
  content: '';
  display: block;
  height: 7px;
  border-radius: 4px 4px 0px 0px;
}

.nice-select .list:after {
  content: '';
  display: block;
  height: 7px;
  border-radius: 0px 0px 4px 4px;
}

.nice-select .option {
  cursor: pointer;
  line-height: 40px;
  list-style: none;
  min-height: 40px;
  outline: none;
  padding-left: 18px;
  padding-right: 29px;
  text-align: left;
  border-left: 7px solid #FFF;
}

.nice-select .option:hover {
  background-color: #000;
  background: #EEEEEE;
  border-left: 7px solid #F65314;
}

.nice-select .option.selected {
  font-weight: bold;
}

.nice-select .option.disabled {
  background-color: transparent;
  color: #999;
  cursor: default;
}

.no-csspointerevents .nice-select .list {
  display: none;
}

.no-csspointerevents .nice-select.open .list {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='form-group-select'>
  <label class='control-label'>GOSTOU?</label>
  <select name='gostou' id='gostou'>
                    <option value=""></option>
                    <optgroup label='PRODUTOS' data-i="1">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                    <optgroup label='PRODUTOS' data-i="2">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                </select>
</div>

<br><br><br><br><br><br><br><br><br>

<button type='submit'>clique aqui e veja o bug</button>

  • Your new element is not in the DOM, I believe that’s why. I’m analyzing the code here to bring a solution

  • is exactly that, if you comment on the execusao and put it inside the click, it works normal

  • well I tested here and it did not work, nor is your example working.

  • When I say it works normal, I mean that after the click I load $('select'). niceSelect(); it will add and will not lose the shape, but the way it is trying to do, no. I am trying in other ways. if possible, put here :D

  • I tried after the click call $('select').niceSelect();. The new select is not placed on the page, but the content stays the same and does not change.

  • look how I tried to make https://jsfiddle.net/vje5xxgb/

Show 1 more comment

1 answer

1


I found it strange that their version 1.1.0 of the plugin is different from the one they present on github: https://github.com/hernansartorio/jquery-nice-select/blob/master/js/jquery.nice-select.js

Anyway, without changing the library you are using, the change you need can be like this:

$("button").on("click", function() {
  // Preenche o elemento select, procura o próximo elemento .nice-select e o remove do DOM
  $('#gostou').html('<option value="1">teste1</option>').next('.nice-select').remove();
  // Executa novamente o plugin niceSelect no elemento
  $('#gostou').niceSelect();
});

Example running:

$("button").on("click", function() {
  $('#gostou').html('<option value="1">teste1</option>').next('.nice-select').remove();
  $('#gostou').niceSelect();
});

/*  jQuery Nice Select - v1.1.0
 https://github.com/hernansartorio/jquery-nice-select
 Made by Hernán Sartorio  */

(function($) {

  $.fn.niceSelect = function() {

    // 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($('<div></div>')
        .addClass('nice-select')
        .addClass($select.attr('class') || '')
        .addClass($select.attr('disabled') ? 'disabled' : '')
        .attr('tabindex', $select.attr('disabled') ? null : '0')
        .html('<span class="current"></span><ul class="list"></ul>')
      );

      var $dropdown = $select.next();
      var $options = $select.find('option');
      var $optgroups = $select.find('optgroup');
      var $selected = $select.find('option:selected');

      $dropdown.find('.current').html($selected.data('display') || $selected.text());

      $options.each(function() {
        var $option = $(this);
        var display = $option.data('display');
        var group = $option.parents('optgroup').data('i');

        $dropdown.find('ul').append($('<li></li>')
          .attr('data-value', $option.val())
          .attr('data-display', (display || null))
          .attr('data-group', (group || null))
          .addClass('option' +
            ($option.is(':selected') ? ' selected' : '') +
            ($option.is(':disabled') ? ' disabled' : ''))
          .html($option.text())
        );
      });
      $optgroups.each(function(i, g) {
        label = $(g).attr('label');
        $dropdown.find('ul li').filter(function() {
            return $(this).data('group') === $(g).data('i');
          })
          .wrapAll('<div class="optgroup"/>')
          .parent()
          .prepend('<span class="label">' + label + '</span>');
      });
    }

    /* 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() {
      var $dropdown = $(this);

      $('.nice-select').not($dropdown).removeClass('open');
      $dropdown.toggleClass('open');

      if ($dropdown.hasClass('open')) {
        $dropdown.find('.option');
        $dropdown.find('.focus').removeClass('focus');
        $dropdown.find('.selected').addClass('focus');
      } else {
        $dropdown.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');
      }
    });

    // Animation loading a page
    $('select').on('blur', function(e) {
      $(this).parents('.form-group-select').toggleClass('focused', (e.type === 'focus' || this.value !== ''));
    }).trigger('blur');

    // Option click
    $(document).on('click.nice_select', '.nice-select .option:not(.disabled)', function() {

      var $option = $(this);
      var $dropdown = $option.closest('.nice-select');

      $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');

      // Animation
      $(this).parents('.form-group-select').toggleClass('focused', ($option.data('value') !== ''));
    });

    // 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;
        }
      }
    });
    return this;
  };
}(jQuery));
$('select').niceSelect();
.control-label {
  pointer-events: none;
  position: absolute;
  transform: translate3d(5px, 22px, 0) scale(1);
  transform-origin: left top;
  transition: 240ms;
}

.form-group-select.focused .control-label {
  transform: scale(0.75);
}

.form-group-select {
  width: 100%;
  margin-top: 20px;
  position: relative;
  height: 45px;
  float: left;
}

.nice-select:before {
  width: 100%;
  height: 1px;
  background: #0091FF;
  position: absolute;
  left: 0;
  bottom: 0;
  content: '';
  transform: scaleX(0);
  transition: ease-in-out 240ms all;
}

.nice-select.open::before {
  transform: scaleX(1);
}

.nice-select {
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  clear: both;
  cursor: pointer;
  display: block;
  height: 42px;
  line-height: 40px;
  outline: none;
  position: relative;
  text-align: left !important;
  -webkit-transition: all 0.2s ease-in-out;
  transition: all 0.2s ease-in-out;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  white-space: nowrap;
  width: 100%;
  border: 0 solid #484848;
  border-bottom-width: 1px;
  margin-top: 3px;
}

.nice-select span {
  margin-left: 5px;
}

.optgroup span {
  padding-left: 10px;
  font-style: italic;
}

.nice-select:hover,
.nice-select:focus {
  border-color: #0091FF;
}

.nice-select:after {
  border-bottom: 2px solid #484848;
  border-right: 2px solid #484848;
  content: '';
  display: block;
  height: 5px;
  margin-top: -4px;
  pointer-events: none;
  position: absolute;
  right: 12px;
  top: 50%;
  -webkit-transform-origin: 66% 66%;
  -ms-transform-origin: 66% 66%;
  transform-origin: 66% 66%;
  -webkit-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
  -webkit-transition: all 0.15s ease-in-out;
  transition: all 0.15s ease-in-out;
  width: 5px;
}

.nice-select.open:after {
  -webkit-transform: rotate(-135deg);
  -ms-transform: rotate(-135deg);
  transform: rotate(-135deg);
}

.nice-select.open .list {
  color: #484848;
  opacity: 1;
  pointer-events: auto;
  -webkit-transform: scale(1) translateY(0);
  -ms-transform: scale(1) translateY(0);
  transform: scale(1) translateY(0);
}

.nice-select.disabled {
  border-color: #ededed;
  color: #999;
  pointer-events: none;
}

.nice-select.disabled:after {
  border-color: #cccccc;
}

.nice-select .list {
  background-color: #FFF;
  border-radius: 4px;
  box-sizing: border-box;
  margin-top: 4px;
  opacity: 0;
  overflow: hidden;
  padding: 0;
  pointer-events: none;
  position: absolute;
  top: 100%;
  left: 0;
  -webkit-transform-origin: 50% 0;
  -ms-transform-origin: 50% 0;
  transform-origin: 50% 0;
  -webkit-transform: scale(0.75) translateY(-21px);
  -ms-transform: scale(0.75) translateY(-21px);
  transform: scale(0.75) translateY(-21px);
  -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  width: 100%;
  z-index: 99;
}

.nice-select .list:before {
  content: '';
  display: block;
  height: 7px;
  border-radius: 4px 4px 0px 0px;
}

.nice-select .list:after {
  content: '';
  display: block;
  height: 7px;
  border-radius: 0px 0px 4px 4px;
}

.nice-select .option {
  cursor: pointer;
  line-height: 40px;
  list-style: none;
  min-height: 40px;
  outline: none;
  padding-left: 18px;
  padding-right: 29px;
  text-align: left;
  border-left: 7px solid #FFF;
}

.nice-select .option:hover {
  background-color: #000;
  background: #EEEEEE;
  border-left: 7px solid #F65314;
}

.nice-select .option.selected {
  font-weight: bold;
}

.nice-select .option.disabled {
  background-color: transparent;
  color: #999;
  cursor: default;
}

.no-csspointerevents .nice-select .list {
  display: none;
}

.no-csspointerevents .nice-select.open .list {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='form-group-select'>
  <label class='control-label'>GOSTOU?</label>
  <select name='gostou' id='gostou'>
                    <option value=""></option>
                    <optgroup label='PRODUTOS' data-i="1">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                    <optgroup label='PRODUTOS' data-i="2">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                </select>
</div>

<br><br><br><br><br><br><br><br><br>

<button type='submit'>clique aqui e veja o bug</button>


Updating:

I made a second version using a blend of the most updated version of them with your changes, I think will suit you better:

$("button").on("click", function() {

  $('#gostou').html('<option value="1">teste1</option>').niceSelect('update');
});

/*  jQuery Nice Select - v1.1.0
    https://github.com/hernansartorio/jquery-nice-select
    Made by Hernán Sartorio  
		
	Customized by: Hugo Borges
	    	       Marco Messa
*/
(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');
					var focused = $select.parents('.form-group-select').hasClass('focused');
          
          if ($dropdown.length) {
            $dropdown.remove();
            create_nice_select($select);
            
            if (open) {
              $select.next().trigger('click');
            } else if (focused) {
							$select.parents('.form-group-select').toggleClass('focused');
						}
          }
        });
      } 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($('<div></div>')
        .addClass('nice-select')
        .addClass($select.attr('class') || '')
        .addClass($select.attr('disabled') ? 'disabled' : '')
        .attr('tabindex', $select.attr('disabled') ? null : '0')
        .html('<span class="current"></span><ul class="list"></ul>')
      );
        
      var $dropdown = $select.next();
      var $options = $select.find('option');
      var $optgroups = $select.find('optgroup');
      var $selected = $select.find('option:selected');
			var focused = $dropdown.hasClass('focused');
			
			if (focused)
      	$dropdown.find('.current').html($selected.data('display') || $selected.text());
      
      $options.each(function(i) {
        var $option = $(this);
        var display = $option.data('display');
        var group = $option.parents('optgroup').data('i');

        $dropdown.find('ul').append($('<li></li>')
          .attr('data-value', $option.val())
          .attr('data-display', (display || null))
          .attr('data-group', (group || null))
          .addClass('option' +
            ($option.is(':selected') ? ' selected' : '') +
            ($option.is(':disabled') ? ' disabled' : ''))
          .html($option.text())
        );
      });
      $optgroups.each(function(i, g) {
        label = $(g).attr('label');
        $dropdown.find('ul li').filter(function() {
            return $(this).data('group') === $(g).data('i');
          })
          .wrapAll('<div class="optgroup"/>')
          .parent()
          .prepend('<span class="label">' + label + '</span>');
      });
    }
    
    /* 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('.focus').removeClass('focus');
        $dropdown.find('.selected').addClass('focus');
      } else {
        $dropdown.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');  
      }
    });

    // Animation loading a page
    $('select').on('blur', function(e) {
      $(this).parents('.form-group-select').toggleClass('focused', (e.type === 'focus' || this.value !== ''));
    }).trigger('blur');

    // Option click
    $(document).on('click.nice_select', '.nice-select .option:not(.disabled)', function(event) {
      var $option = $(this);
      var $dropdown = $option.closest('.nice-select');
      
      $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');

      // Animation
      $(this).parents('.form-group-select').toggleClass('focused', ($option.data('value') !== ''));
    });

    // 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));
$('select').niceSelect();
.control-label {
  pointer-events: none;
  position: absolute;
  transform: translate3d(5px, 22px, 0) scale(1);
  transform-origin: left top;
  transition: 240ms;
}

.form-group-select.focused .control-label {
  transform: scale(0.75);
}

.form-group-select {
  width: 100%;
  margin-top: 20px;
  position: relative;
  height: 45px;
  float: left;
}

.nice-select:before {
  width: 100%;
  height: 1px;
  background: #0091FF;
  position: absolute;
  left: 0;
  bottom: 0;
  content: '';
  transform: scaleX(0);
  transition: ease-in-out 240ms all;
}

.nice-select.open::before {
  transform: scaleX(1);
}

.nice-select {
  -webkit-tap-highlight-color: transparent;
  box-sizing: border-box;
  clear: both;
  cursor: pointer;
  display: block;
  height: 42px;
  line-height: 40px;
  outline: none;
  position: relative;
  text-align: left !important;
  -webkit-transition: all 0.2s ease-in-out;
  transition: all 0.2s ease-in-out;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  white-space: nowrap;
  width: 100%;
  border: 0 solid #484848;
  border-bottom-width: 1px;
  margin-top: 3px;
}

.nice-select span {
  margin-left: 5px;
}

.optgroup span {
  padding-left: 10px;
  font-style: italic;
}

.nice-select:hover,
.nice-select:focus {
  border-color: #0091FF;
}

.nice-select:after {
  border-bottom: 2px solid #484848;
  border-right: 2px solid #484848;
  content: '';
  display: block;
  height: 5px;
  margin-top: -4px;
  pointer-events: none;
  position: absolute;
  right: 12px;
  top: 50%;
  -webkit-transform-origin: 66% 66%;
  -ms-transform-origin: 66% 66%;
  transform-origin: 66% 66%;
  -webkit-transform: rotate(45deg);
  -ms-transform: rotate(45deg);
  transform: rotate(45deg);
  -webkit-transition: all 0.15s ease-in-out;
  transition: all 0.15s ease-in-out;
  width: 5px;
}

.nice-select.open:after {
  -webkit-transform: rotate(-135deg);
  -ms-transform: rotate(-135deg);
  transform: rotate(-135deg);
}

.nice-select.open .list {
  color: #484848;
  opacity: 1;
  pointer-events: auto;
  -webkit-transform: scale(1) translateY(0);
  -ms-transform: scale(1) translateY(0);
  transform: scale(1) translateY(0);
}

.nice-select.disabled {
  border-color: #ededed;
  color: #999;
  pointer-events: none;
}

.nice-select.disabled:after {
  border-color: #cccccc;
}

.nice-select .list {
  background-color: #FFF;
  border-radius: 4px;
  box-sizing: border-box;
  margin-top: 4px;
  opacity: 0;
  overflow: hidden;
  padding: 0;
  pointer-events: none;
  position: absolute;
  top: 100%;
  left: 0;
  -webkit-transform-origin: 50% 0;
  -ms-transform-origin: 50% 0;
  transform-origin: 50% 0;
  -webkit-transform: scale(0.75) translateY(-21px);
  -ms-transform: scale(0.75) translateY(-21px);
  transform: scale(0.75) translateY(-21px);
  -webkit-transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  transition: all 0.2s cubic-bezier(0.5, 0, 0, 1.25), opacity 0.15s ease-out;
  width: 100%;
  z-index: 99;
}

.nice-select .list:before {
  content: '';
  display: block;
  height: 7px;
  border-radius: 4px 4px 0px 0px;
}

.nice-select .list:after {
  content: '';
  display: block;
  height: 7px;
  border-radius: 0px 0px 4px 4px;
}

.nice-select .option {
  cursor: pointer;
  line-height: 40px;
  list-style: none;
  min-height: 40px;
  outline: none;
  padding-left: 18px;
  padding-right: 29px;
  text-align: left;
  border-left: 7px solid #FFF;
}

.nice-select .option:hover {
  background-color: #000;
  background: #EEEEEE;
  border-left: 7px solid #F65314;
}

.nice-select .option.selected {
  font-weight: bold;
}

.nice-select .option.disabled {
  background-color: transparent;
  color: #999;
  cursor: default;
}

.no-csspointerevents .nice-select .list {
  display: none;
}

.no-csspointerevents .nice-select.open .list {
  display: block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='form-group-select'>
  <label class='control-label'>GOSTOU?</label>
  <select name='gostou' id='gostou'>
                    <option value=""></option>
                    <optgroup label='PRODUTOS' data-i="1">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                    <optgroup label='PRODUTOS' data-i="2">
                        <option value="s">SIM</option>
                        <option value="n">NÃO</option>
                </select>
</div>

<br><br><br><br><br><br><br><br><br>

<button type='submit'>clique aqui e veja o bug</button>

This new example redoes the animation by returning niceSelect to the closed state and uses the plugin update method.

  • worked out, my version and different because I made several changes in it. To put the effects of layouts I wanted. Thank you so much for the help.

  • I could only explain uses answer, I did not understand very well why it worked hahaha.

  • Is that version 1.1.0 of them has the methods update and destroy

  • strange because it worked the version I changed. what made it work .next('.nice-select').remove();

  • @Hugoborges commented on the code to better explain why it worked.

  • now I get it.

  • @Hugoborges did an update that might suit you better.

  • very good. thank you.

Show 3 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.