Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.03.2018, 15:17
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Управление checkbox'ами
Здравствуйте, делаю некое подобие БЭМ-компонентов. Дошел до checkbox. Есть вот такая структура чекбокса:
<label class="checkbox checkbox--size-m">
    <span class="checkbox__box">
        <input class="checkbox__control" type="checkbox" autocomplete="off">
    </span>
    <span class="checkbox__text">Коробка</span>
</label>

При клике на checkbox, вернее на label с классом checkbox, элементу label добавляется класс .checkbox--checked, а непосредственно инпату(который и является чекбоксом) с классом .checkbox__control добавляется атрибут checked="checked":
<label class="checkbox checkbox--size-m checkbox--checked">
    <span class="checkbox__box">
        <input class="checkbox__control" type="checkbox" autocomplete="off" checked="checked">
    </span>
    <span class="checkbox__text" >Конфеты</span>
</label>

Вот такой код мне удалось написать для выполнения этой задачи:
$(function() {
    $(".checkbox").on("click", function(event) {
        event.preventDefault();       
        $(this).toggleClass("checkbox--checked");

        var chekcbox = $(this).children().children('.checkbox__control');
        
        if (chekcbox.attr('checked')) {
            chekcbox.removeAttr('checked');
        } else {
            chekcbox.attr('checked', 'checked');
        };

    });
});

Все в принципе работает, никаких проблем я не обнаружил пока, но насколько это правильно. Допустим правильно ли отслеживать именно клик $(".checkbox").on("click" .....) или возможно есть более подходящее событие. И очень смущает поиск инпата $(this).children().children('.checkbox__control'). Подскажите нормальное ли решение или есть что можно подправить? Спасибо
Ответить с цитированием
  #2 (permalink)  
Старый 17.03.2018, 16:00
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>

	<label class="checkbox checkbox--size-m">
		<span class="checkbox__box">
			<input class="checkbox__control" type="checkbox" autocomplete="off">
		</span>
		<span class="checkbox__text">Коробка</span>
	</label>
<script>

$(function() {
    $(".checkbox__control").on("change", function(event) {
 	if(this.checked) $(this).closest(".checkbox").addClass('checkbox--checked');
 	else $(this).closest(".checkbox").removeClass('checkbox--checked');
    });
});

	</script>
</body>
</html>

Последний раз редактировалось j0hnik, 17.03.2018 в 16:03.
Ответить с цитированием
  #3 (permalink)  
Старый 17.03.2018, 16:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style type="text/css">
  .checkbox--checked   {
    background-color:  #FF0000;
  }

  </style>
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>
<body>

  <label class="checkbox checkbox--size-m">
    <span class="checkbox__box">
      <input class="checkbox__control" type="checkbox" autocomplete="off">
    </span>
    <span class="checkbox__text">Коробка</span>
  </label>
<script>

$(function() {
    $(".checkbox").on("change", function(event) {
    $(this).toggleClass('checkbox--checked');
    });
});

  </script>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 17.03.2018, 16:42
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

j0hnik,
Спасибо. Класс меняется, но вот атрибут - нет, судя по коду его там и нет=)
Ответить с цитированием
  #5 (permalink)  
Старый 17.03.2018, 16:45
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Сообщение от рони
$(function() {

    $(".checkbox").on("change", function(event) {

    $(this).toggleClass('checkbox--checked');

    });

});
Тут немного не то, класс .checkbox у label=)
Ответить с цитированием
  #6 (permalink)  
Старый 17.03.2018, 17:21
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

Сообщение от Tipylja
Тут немного не то, класс .checkbox у label=)
не понимаю
Ответить с цитированием
  #7 (permalink)  
Старый 17.03.2018, 17:21
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Tipylja,
если вам атрибут нужен, а не свойство то его нужно в скрипте меня.
в целом если ваш пример вас устраивает
исправьте
$(this).children().children('.checkbox__control');

на
$(this).find('.checkbox__control');

и пользуйтесь
Ответить с цитированием
  #8 (permalink)  
Старый 17.03.2018, 17:32
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Всем как всегда спасибо! Вот финальный скрипт так выглядит:
$(function() {
    $(".checkbox__control").on("change", function(event) {

        var chekcbox = this;

        if(chekcbox.checked) $(chekcbox).closest(".checkbox").addClass('checkbox--checked');
        else $(chekcbox).closest(".checkbox").removeClass('checkbox--checked');



        if ($(chekcbox).attr('checked')) {
            chekcbox.removeAttr('checked');
        } else {
            $(chekcbox).attr('checked', 'checked');
        };
    });
});

Последний раз редактировалось Tipylja, 17.03.2018 в 17:40.
Ответить с цитированием
  #9 (permalink)  
Старый 17.03.2018, 18:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,081

Tipylja,
зачем нужно атрибут менять?
Ответить с цитированием
  #10 (permalink)  
Старый 18.03.2018, 00:46
Аспирант
Отправить личное сообщение для Tipylja Посмотреть профиль Найти все сообщения от Tipylja
 
Регистрация: 17.04.2017
Сообщений: 72

Сообщение от рони Посмотреть сообщение
Tipylja,
зачем нужно атрибут менять?
Если честно, на данный момент не знаю где бы мне это пригодилось, так сделано у яндекса в бэм-компонентах
https://ru.bem.info/platform/libs/be...ktop/checkbox/
Я эту часть кода, на данный момент уберу, но если возникнет необходимость, то можно будет сразу же воспользоваться
PS. Возможно, так как класс .checkbox--checked, задается деду чекбокса, то получать именно чекбоксы, которые включены, как раз можно по этому атрибуту....

Последний раз редактировалось Tipylja, 18.03.2018 в 00:50.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
web управление на основе javascript MaksLuk Элементы интерфейса 31 29.03.2015 21:27
Управление Slick slider при помощи JQ.ui Drm1804 jQuery 3 12.03.2015 14:16
Управление звуком компьютера manafon Общие вопросы Javascript 6 29.07.2013 20:21
jsTree с checkbox'ами с сохранением изменений в БД Rooner jQuery 1 26.06.2013 22:27
Управление checkboxами kolomiets.web-art Общие вопросы Javascript 1 29.10.2010 18:47