div - это блочный элемент.
Я имел ввиду, что нативный чекбокс - строчный элемент, так зачем его заменять блочным? Чем span не угодил?
Раз уж вы за логику, то не надо засовывать чекбокс в абзац, ибо <p>.. - определяет текстовый абзац.
Думаю не я один верстаю формы на <p> - часто это удобно, и в этом ничего плохого я не вижу.
Лучше, но основная идея состоит в другом. Я за то, что бы понимать что и почему происходит. По этому рецепт показывает все "движения" внутри. Динамическая замена - это следующий шаг.
Ждем этот шаг. Ведь чекбоксы часто генерируются модулями и компонентами - нет нужды ковырять и хакать их чтоб изменить разметку - все равно наши чекбоксы работают только при включенном js.
Про функцию - согласен только при частных случаях. Алгоритм был взят из более сложного случая, где функцию требовалось вызывать несколько раз.
Но это не объясняет причину объявления ее как глобальной? По сути вы объявляете
window.checking - зачем этот метод объекту window?
Изучив ваш пример, начинающий js-кодер создаст в следующий раз функцию
open, и будет недоумевать, почему поламался код вызова всплывающего окна, который написан как
window.open(...)Потому что не обязательно все ограничится сменой атрибута.
Но ведь дважды вызывается одинаковый код, просто с разным параметром. Не лучше, очевиднее и проще ли написать код, а параметр писать в локальную переменную?
В соответствии со всем, сказанным выше, привожу примерный код:
(function($){
// вешаем наш код на domready
$(document).ready(function(){
// инициализация состояния псевдочекбоксов
$(".checkbox").each(function(){
var checked = $('input', this).is(':checked');
$(this).toggleClass('checked', checked);
});
// оживляем псеводчекбоксы
$(".checkbox").click(function(){
var checked = $('input', this).is(':checked');
$(this).toggleClass('checked', !checked);
$('input', this).attr('checked', !checked);
});
});
})(jQuery);
Ведь это короче и яснее чем
function checking() {
// функция проверяет состояние настоящего чекбокса
// и устанавливает стиль для соответствующего псевдо-чекбокса
jQuery.each(jQuery(".checkbox"),
function(){
if(jQuery(this).find("input").is(':checked')){
jQuery(this).addClass("checked");
}else{
jQuery(this).removeClass("checked");
}
}
);
}
jQuery(document).ready(
function(){
checking(); // функция проверки запустится при загрузке страницы
jQuery(".checkbox").click(
// скрипт будет менять состояние настоящего чекбокса
// и стиль псевдо-чекбокса при клике по нему
function(){
jQuery(this).toggleClass("checked");
if(jQuery(this).find("input").is(':checked')){
jQuery(this).find("input").attr("checked", false);
}else{
jQuery(this).find("input").attr("checked", true);
}
}
);
}
);