Я предполагаю, что причина, по которой вы помещаете input
внутри label
, заключается в том, что вы можете переключать «выбранный» класс в зависимости от состояния флажка, и заставить его работать при нажатиилибо к метке, либо к флажку.
Вот один из способов достижения этого при разделении label
и input
: http://jsfiddle.net/pkuCe/
$('#cb').change(function(){
$("label[for=cb]").toggleClass("selected", this.checked);
});
Это устанавливает класс на label
в зависимости от состояния флажка, и должен работать, когда флажок или ярлык нажаты.
Почему ваш текущий подход не работает?
Из спецификаций нет ничего плохого во вложении input
в тег label
:
for = idref [CS]
Этот атрибут явно связывает определяемую метку с другим элементом управления.При наличии значение этого атрибута должно совпадать со значением атрибута id какого-либо другого элемента управления в том же документе. При отсутствии определяемая метка ассоциируется с содержимым элемента.
Однако, похоже, что ваша проблема связана с тем, что click
событие запускается дважды (таким образом сводя на нет переключение), когда у вас есть вложенный элемент input
.Я не тестировал его во всех браузерах, но, похоже, это происходит в FF8.
Попробуйте щелкнуть метку в этом примере: http://jsfiddle.net/cRnJS/
Видимо, клики по элементам label
вызываютсобытие click
в связанном с ним input
(именно поэтому проверка / снятие флажка срабатывает), и это событие всплывает вверх, что вызывает его повторный запуск в родительском label
.
Выводы?
- Спецификации HTML, если вы можете иметь
input
, вложенные в label
, но было бы разумно оставить их отдельно - Используйте
change
событие вместо click
.(примечание: вы можете иметь несколько ярлыков для каждого input
)