Как я могу получить последнее выбранное значение в ListBox с помощью jQuery? - PullRequest
3 голосов
/ 21 октября 2009

У меня есть список, и я должен ограничить его выбор до 5 пунктов. Если выбран 6-й элемент, я хочу отменить его выбор.

Но у меня возникли проблемы с поиском последнего выбранного элемента и его отменой. И последний выбранный элемент необходимо $ ("# mySelect option: last") ...

Как я могу получить выбранный элемент из списка ??

Спасибо !!!

Ответы [ 7 ]

5 голосов
/ 21 октября 2009

Это будет сделано, хотя есть небольшая «вспышка» выбора (вы можете захотеть, чтобы под <select> не отображалось <span>, чтобы сказать что-то вроде Максимальный выбор достигнут).

$('#mySelect').click(function(e) {
  if ($('option:selected',this).length > 5) {    
     $(e.target).removeAttr('selected');  
  }
});

Я оставлю это как упражнение для вас, чтобы заставить его работать и с селективностью клавиатуры.

Вот вам Рабочая демоверсия

EDIT:

Хорошо, я признаю, что это не первый раз, когда меня ужалили, когда я тоже не тестировал ответ в IE (кажется, что много проблем с элементами <select> в IE), но здесь Это гибкое решение, которое я протестировал в IE 6 и Firefox 3.5.3, и оно работает в обоих. Я обернул его в плагин, на случай, если это понадобится на нескольких страницах

(function($) {

$.fn.maxLimitSelect = function(max) {

  if (!max || !/^\d+$/.test(max)) return this;

  return this.each(function() {

    $(this).bind("click change keypress",{ max: max },function(event) {

      var options = $('option', this);
      var max = event.data.max;
      var selected = $('option:selected', this);
      var indexes;

      if (selected.length === max) {  
       indexes = $.map(options, function(e, i) { 
                   if(e.selected) return i; 
                 }); 
       $.data(this, "indexes", indexes);
      }
      else if (selected.length > max) {
       indexes = $.data(this, "indexes");
       options
         .removeAttr('selected')
         .each(function() { 
           var $this = $(this);
           if ($.inArray($this.prevAll().length, indexes) !== -1) {  
             $this.attr('selected','selected');
           }
         });   
      } 
    });
  });
}

})(jQuery);

Тогда использовать, это просто

$('#mySelect').maxLimitSelect(5);

передавая максимальное количество элементов, которые могут быть выбраны. Это работает с выбором клавиш и мыши в протестированных версиях IE и Firefox, хотя интересно, что IE 6 не поддерживает удержание Ctrl и Пробел для выбора нескольких элементов, но позволяет удерживая Shift , выберите несколько смежных элементов. Плагин ограничивает это переданным максимумом.

Вот Рабочая демоверсия

2 голосов
/ 21 октября 2009

: последняя часть вашего селектора выберет «последний» физический элемент в списке выбора (это не относится к тому, выбран он или нет).

AFAIK, вам нужно перебрать опции и проверить, выбран ли каждый (для подсчета) или использовать псевдоселектор: selected.

//Or as noted by @peirix you can try to get it with :selected.
//Note that this will just clear the last (by rendered order) selection...
//not the "last" option that was selected.

if($("#mySelect option:selected").size() >= 6){
  $("#mySelect option:selected:last").attr('selected', null);
}

UPDATE:

Ух ты, это было сложнее, чем я думал! ... ниже приведен проверенный пример, который работает ... он может быть чище, но я оставлю это другим, чтобы взломать; -)

<script>
  $('#mySelect').bind('change', function(){
    if($("#mySelect option:selected").size() == 5){
      //5 picked, (re)store them...
      var sel = [];
      $("#mySelect option").each(function(i){
        if($(this).attr('selected')){
          sel[i] = true;
        } else {
          sel[i] = false;
        }
      });
      $(this).data('selectedIndexes',sel);
    } else if($("#mySelect option:selected").size() >= 6){
      //too many reset to orig...
      $("#mySelect option").each(function(i){
        if($(this).parent().data('selectedIndexes')[i]){
          $(this).attr('selected', 'selected');
        } else {
          $(this).attr('selected', '');
        }
      });
    }
  });
</script>

образец HTML:

<select id="mySelect" multiple="multiple" size="12">
  <option value="a">aaaaaaaaaaaa</option>
  <option value="b">bbbbbbbbbbbb</option>
  <option value="c">cccccccccccc</option>
  <option value="d">dddddddddddd</option>
  <option value="e">eeeeeeeeeeee</option>
  <option value="f">ffffffffffff</option>
  <option value="g">gggggggggggg</option>
  <option value="h">hhhhhhhhhhhh</option>
  <option value="i">iiiiiiiiiiii</option>
  <option value="j">jjjjjjjjjjjj</option>
  <option value="k">kkkkkkkkkkkk</option>
  <option value="l">llllllllllll</option>
</select>
1 голос
/ 21 октября 2009

Это будет в основном прослушивать любые варианты, которые нажимаются. Если щелкнуть один из них, сценарий проверяет, сколько всего вариантов выбрано (включая только что выбранный). Если количество выбранных параметров больше 5, последний из выбранных элементов станет «отмененным».

$("#mySelect").click(function() {
    var num_selected = $('#mySelect option:selected').length;
    if(num_selected > 5) {
        $(e.target).removeAttr('selected');
    }
});

Если вы хотите, чтобы люди знали, почему их выбор был отменен, вы можете сделать это:

$("#mySelect").click(function(e) {
    var num_selected = $('#mySelect option:selected').length;
    if(num_selected > 5) {
        $(e.target).removeAttr('selected');
        alert('You are limited to 5 options at a time...');
    }
});

Надеюсь, у вас получится. Этот код был вдохновлен Peirix.

0 голосов
/ 22 марта 2011

$('#mySelect option:selected').length; не работает в IE. Хорошо работает в Chrome, хотя.

0 голосов
/ 21 октября 2009

Это похоже на небольшую тестовую страницу, которую я сделал:

$('#mySelect option:selected:gt(4)').removeAttr('selected')
0 голосов
/ 21 октября 2009

Ты должен получить последний? Вы не можете просто посчитать, сколько из них выбрано, а затем предотвратить дальнейшие выборы?

Эта функция проверит, что данный элемент SELECT содержит меньше, чем «максимум» выбранных опций.

function checkLimits( list, maximum ) {
    var options = list.options;
    var size = options.length;
    var numSelected = 0;

    for( var i = 0; i < size; ++i ) {
        if( options[ i ].selected ) ++numSelected;
    }
    if( numSelected > maximum ) {
        alert( 'You have selected more than ' + maximum + ' options.\n' +
            'Please deselect ' + ( numSelected - maximum ) + ' option(s) then
            try again.' );
        return false;
    }
    return true;
}

Чтобы вызвать его непосредственно из события отправки формы, вы можете сделать:

<select ... onsubmit="return checkLimits(this.listName, 2)">

Вы можете jQueryify, но это должно начать вас. Взято из http://bytes.com/topic/javascript/answers/93760-please-help-limit-number-selections-multiple-select-list-box#post316514

0 голосов
/ 21 октября 2009

Это должно сработать:

$("#mySelect option:checked:last").val(); //or not

Небольшое переписывание ответа Кори Ларсона:

$("#mySelect option").mousedown(function() {
   if ($("#mySelect :checked").length > 5) {
      return false;
   }
   return true;
});

Это просто не позволит пользователю проверить другую опцию, когда будет достигнуто максимальное количество. И, возможно, вы могли бы написать что-нибудь пользователю, объяснив, что максимальное число было достигнуто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...