2015-08-02 2 views
3

Я хочу получить только добавленную стоимость/исключен из выделения вместо массива со всеми выбранными значениями.получить значение и статус (выбранный или нет) опции, которая запускает событие множественного выбора onchange

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

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

Еще одна альтернатива, о которой я только что подумал: вместо отслеживания каждого состояния селектора, используя событие onfocus, чтобы сохранить состояние селектора, который должен быть изменен (но все же я предпочел бы решение, где мне не нужно сравните состояния, если они есть).

Текущее решение: используйте bootstrap multiselect jquery plugin's onchange option (bootstrap multiselect превращает селектор в список, чтобы каждый параметр можно было контролировать индивидуально, используя собственное событие onchange). Любые «плагины» идеи?

ответ

1

Я не думаю, что существует какое-то достойное решение. Создайте собственный плагин jQuery для сравнения абстрактных состояний.

Может быть, этот маленький плагин, который запускает пользовательский optionChange событие в списке, обеспечивая два дополнительных параметра (значение, состояние) может помочь вам:

$.fn.trackOptions = function(){ 
    return this.each(function(){ 
     var $select = $(this), 
      oldItems = $select.val() || []; 
     $select.data("oldItems", oldItems) 
     .on("change", function(e){ 
      var oldItems = $select.data("oldItems"), 
       newItems = $select.val() || []; 
      for(var i=0; i<oldItems.length; ++i) { 
       if(newItems.indexOf(oldItems[i]) == -1){ 
        $select.trigger("optionChange", [oldItems[i], false]); 
       } 
      } 
      for(i=0; i<newItems.length; ++i){ 
       if(oldItems.indexOf(newItems[i]) == -1){ 
        $select.trigger("optionChange", [newItems[i], true]); 
       } 
      } 
      $select.data("oldItems", newItems); 
     }); 
    }); 
} 

jsFiddle

При необходимости, вы можете изменить его триггером одно событие со списком удаленных опций.

+0

блестящий! Он предоставляет точные функции, которые мне нужны, без добавления узлов списка в DOM или загрузки гораздо большего плагина. Благодаря! – NotGaeL

+0

Рад, что я мог помочь. Обратите внимание, что [Array.prototype.indexOf] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf) недоступен в IE8, поэтому, если вы ориентируетесь на старые браузеры, Я предлагаю вам включить на эту страницу полипол. – nrodic

+0

не тот случай, но спасибо за головы. Я все равно сделаю :-) – NotGaeL

 Смежные вопросы

  • Нет связанных вопросов^_^