2013-05-17 1 views
1

Я нашел этот jfiddle из другого сообщения здесь. неКод для работы с jquery 1.9

Оригинал: http://jsfiddle.net/ZTF5J/2/

С 1.9 и мои изменения: http://jsfiddle.net/4423c/

Похоже .live() больше не поддерживается с Jquery 1.9. Мне удалось изменить часть кода, чтобы удалить раскрывающееся меню, но добавление нового фильтра не работает должным образом.

Следующий код позволяет удалить фильтр за раз. Однако при добавлении нового фильтра он не проверяет, существует ли в настоящее время значение.

$('body').on('click', '.closeselect', function(){  
    if($('.closeselect').length > 1) { 
     $(this).parent().remove(); 
     disableSelectedOption(); 
     $('#addmore').show(); 
    } 
}); 

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

$('body').on('change', '.mySelect', function(){  
    disableSelectedOption(); 
}); 
+1

Каков точный вопрос? «но добавление нового фильтра не работает должным образом» - не является объяснением, мы понятия не имеем, что «правильно» для вас – zerkms

+0

не используют .attr для изменения свойства. –

+0

Итак, добавьте новый фильтр и выберите «Search2». Теперь удалите первый раскрывающийся список «Search1» и добавьте новый фильтр. Обратите внимание, что он не учитывает, что «Search2» уже выбран. – luckytaxi

ответ

3

$(this).attr('disabled', 'disabled');

должно быть

$(this).prop('disabled', 'disabled');

от jQuery .attr manual entry:

По JQuery 1.6, метод .attr() возвращает неопределенное значение для атрибутов, которые не были установлены. Для того, чтобы получать и изменять свойства DOM, такие как checked, selected или disabled состояние элементов формы, используют метод .prop().

+0

Кажется, не работает. Должен ли я менять BOTH экземпляры кода? он указан дважды, один раз в функции 'disableSelectedOption', а затем снова вверху. – luckytaxi

+1

Да. http://jsfiddle.net/Y8r4e/ работает. –

+0

Ты прав, и я прошу прощения. Я не должен был правильно обновлять свой браузер. БЛАГОДАРЯ!!!! – luckytaxi

0

Есть несколько вещей, которые не так с кодом, поэтому я переписать его here:

$(function() { 
    var $container = $('.js-selectblock'), 
    nrOfOptions = $container.find('select').prop('options').length, 
    $getBlocks = function() { 
     return $container.children('.js-select'); 
    }, 
    $getParent = function(element) { 
     return $(element).closest('.js-select'); 
    }; 

    $('#addmore').click(function() { 
     var $blocks = $getBlocks(); 

     if ($blocks.length < nrOfOptions) { 
      // restrict values on new dropdown 
      var $new = $blocks.eq(0).clone(); 
      restrictValues($new.find('select'), getSelectedValues(), true); 
      $new.appendTo($container); 

      updateButtons(); 
     } 
    }); 

    $container.on('click', '.closeselect', function() { 
     if ($getBlocks().length > 1) { 
      $getParent(this).remove(); 
      updateButtons(); 
     } 
    }); 

    $container.on('change', '.mySelect', function() { 
     $getBlocks().not($getParent(this)).each(function() { 
      restrictValues($('select', this), getSelectedValues()); 
     }); 
    }); 

    function restrictValues($element, values, isnew) 
    { 
     var options = $element.prop('options'), 
     selected = $element.prop('selectedIndex'); 

     for (var i = 0; i < options.length; ++i) { 
      if (values.indexOf(options[i].value) !== -1) { 
       options[i].disabled = isnew || selected != i; 

       if (isnew && selected == i) { 
        ++selected; 
       } 
      } else { 
       options[i].disabled = false; 
      } 
     } 
     $element.prop('selectedIndex', selected); 
    } 

    function getSelectedValues() 
    { 
     var values = []; 

     $getBlocks().find('select').each(function() { 
      values.push($(this).val()); 
     }); 

     return values; 
    } 

    function updateButtons() 
    { 
     $('#addmore')[$getBlocks().length < nrOfOptions ? 'show' : 'hide'](); 
    } 
}); 
Смежные вопросы