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

у меня есть раскрывающийся список времени, который показывает час в одном выборе, минуты в другом и AM/PM в третьем. У меня стоит галочка "Весь день"

я хочу, чтобы, когда пользователь проверяет «Весь день», все раскрывающиеся списки выбора отключались.


person leora    schedule 21.08.2009    source источник


Ответы (2)


Проблема с флажками в основном заключается в том, чтобы заставить их правильно работать в IE6, поскольку событие change срабатывает во всех бесполезных случаях.

Начнем с функции для отключения:

function onCheckChange() {
  if ($("#all-day-checkbox").is(':checked'))
    $("select").attr('disabled', 'disabled');
  else
    $("select").removeAttr('disabled');
}

Обратите внимание, что здесь я использую только select, что почти наверняка шире, чем вам хотелось бы, но select.some-class-to-identify-the-hours-and-minutes-and-seconds-dropdowns будет работать так же хорошо.

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

Теперь нам просто нужно связать эту функцию с несколькими разными событиями:

$("#all-day-checkbox").click(onCheckChange).change(onCheckChange);
$("label[for=all-day-checkbox]").click(onCheckChange);
person VoteyDisciple    schedule 21.08.2009
comment
@oo - вам нужно будет поместить как минимум код привязки в (document).ready, вы можете поместить в него функцию onCheckChange, но это не обязательно. - person karim79; 21.08.2009
comment
для чего нужна вторая строка метки внизу? - person leora; 21.08.2009
comment
select работает нормально, но когда я меняю его на select.hours или select.time, он перестает работать. какие-либо предложения? - person leora; 21.08.2009
comment
Щелчок по ярлыку важен в мире IE, поэтому ваше событие сработает, если пользователь щелкнет по ярлыку, а не по флажку, поскольку событие щелчка — это то, что сработает первым. select.hours будет работать нормально, пока в этом поле select есть class="hours". Я бы предложил дать им всем class="time-picker" (или что-то подобное), а затем вы можете использовать select.time-picker в jQuery. - person VoteyDisciple; 21.08.2009

Попробуй это.

$('#checkbox').change(function(){
    $('#Hour, #Minute, #Period').attr('disabled', this.checked);    
}); 
person ChaosPandion    schedule 21.08.2009
comment
Я не думаю, что onchange можно использовать для флажков. По крайней мере, это не сработало, когда я тестировал. Или, если его можно использовать, я не знаю, сработает ли он здесь, поскольку значение флажка технически не меняется. - person Josh Leitzel; 21.08.2009
comment
Интересный. Не знал, что вы можете использовать onchange для чего угодно, кроме поля выбора. Но я полагаю, что это разумно, учитывая, что документы jQuery говорят, что это происходит, когда элемент управления изменяет значение. В этом случае все еще немного запутанно. Кроме того, ваш код является односторонним. Что делать, если пользователь снимает флажок #checkbox? - person Josh Leitzel; 21.08.2009
comment
Вопреки распространенному мнению, вы можете установить disabled равным логическому значению. - person ChaosPandion; 21.08.2009
comment
Упс, нвм. Думаю, вы прикрыли это логическим значением this.checked. :п - person Josh Leitzel; 21.08.2009