Итак, вот как выглядит моя форма.
и JS я попробовал:
$('#work_direction').on('click' , function() {
$('.cad, .design, .shop, .cnc').on('click', function(){
$classname = $(this).attr('class');
if($('.' + $classname + ":checked").length > 0){
$('#' + $classname).attr('checked','checked');
} else {
$('#' + $classname).removeAttr('checked');
}
});
});
Там есть некоторые функции, и это работает, насколько я знаю. Тем не менее, я хочу сделать так, чтобы, когда "Мексика" выбрана в Direction, когда пользователь проверяет S-SHOP или M-CNC, он не должен проверять эти два в зависимых отделах
но вместо этого он должен проверить
Форма должна работать так же, как и для внутренних и оффшорных, в том случае, когда нижние C, D, S, M проверяются, тогда верхняя CAD, Design, Shop, CNC, проверяется. Функциональность изменяется, как описано выше, когда пользователь выбирает "Мексику" в качестве направления.
Вот код, который я пробовал, Check and uncheck checkbox работает неправильно, но у меня были проблемы, описанные в комментарии beautifulcoder: "В принципе, я думаю, что у вас возникают проблемы с пузырьковым событием. Если вы используете live(), jQuery добавит событие сейчас и в будущем. В следующий раз, когда вы добавите событие, оно будет добавлено в список ".
Я не уверен, как реализовать исправление или есть лучший подход.
Хотя может возникнуть основная проблема с пузырьками событий (поскольку вы добавляете новую onClick()
каждый раз, когда вызывается щелчок), я считаю, что вы неправильно атакуете проблему. Посмотрите на свой код:
$classname = $(this).attr('class');
if($('.' + $classname + ":checked").length > 0){
$('#' + $classname).attr('checked','checked');
} else {
$('#' + $classname).removeAttr('checked');
}
Эта часть захватывает имя текущего класса элемента и проверяет, проверено ли оно. Затем он находит элемент, идентификатор которого соответствует его собственному имени класса и либо проверяет, либо отменяет его. В вашем примере элемент, чей идентификатор является mexico
, никогда не будет выбран, если ваш чекбокс CNC не имеет имени класса mexico
. Кроме того, нигде в вашем коде вы не изменяете эти имена классов при изменении значения окна выбора выпадающего меню.
Я бы предположил, что если вы можете использовать HTML5, используйте предоставленную им функцию данных. Это позволит вам указать, какие элементы должны быть проверены без конфликтов или неправильных идентификаторов/имен классов.
Вот пример этого в действии: JSFiddle
JQuery в примере:
$('#work_direction').on('change', function() {
if ($(this).val() == 'mexico') {
$('.shop, .cnc').data('check', 'mexico');
}
else {
$('.shop').data('check', 'shop');
$('.cnc').data('check', 'cnc');
}
});
$('.cad, .design, .shop, .cnc').on('change', function() {
// Split into space-delimited array in case we want
// to check off more than one
var elemsToCheck = $(this).data('check').split(' ');
var checked = $(this).attr('checked');
$.each(elemsToCheck, function() {
$('#' + this).attr('checked', !!checked);
});
});
Мой пример также позволяет указать несколько data-check
атрибуте data-check
. Просто разделите каждый на пробел.
взгляните на событие change
сочетании с функцией prop
например, так
$('#work_direction').on('change' , function() {
var direction = $(this).val();
$('#'+direction).prop('checked', true);
});