Pull to refresh

Comments 76

потому что нельзя стилизовать чекбоксы.
вы не учли много вариантов:

если чекбокс при старте страницы
— чекнут
— в фокусе
— задизейбленый
— задизейбленый и ченутий
— чекнут и в фокусе

плюс в вашем варианте нет колбеков, нет кастомных событей, не изменится состояние чекбокса когда у него фукус и вы жмете пробел, не подсвечивается при таб-обходе, при ресете не изменится картинка…
может, все же лучше и аккуратнее использовать полифилл вроде selectivizr.com/?
этот плагин рассчитан не только иметь возможность стилизировать чекбоксы, но и иметь инструмент для того чтобы изменять разные состояния одного или групы чекбоксов.
а почему бы их просто не навесить на сами чекбоксы?
$input.on('change'). А вас что-то смущает?
Вы хотите сказать что обработчик событие change сработает если атрибут disabled получит значение disabled?

Я тепер понимаю какой у вас уровень jQuery, и почему вы так отстаиваете на не всюду рабочей версии CSS с малым количеством возможностей.
А кто победил, заплюсованный или заминусованный?
да, прошу прощения, задумался, перепутал с checked.
Checked (параметр html-ноды, не атрибут) запускает событие change:
document.querySelector('input').checked = true

Корректно и правильно возможно отлавливать изменение любого атрибута, в том числе disabled, только так(возможно, где-то есть баг, я не проверял код):

(new MutationObserver(function(mutationRecords){
    [].forEach.call(mutationRecords, function(mutationRecord){
        if ((mutationRecord.target.tagName === 'INPUT') && 
            (mutationRecord.target.type === 'checkbox') && 
            (mutationRecord.attributeName === 'disabled')) 
                  mutationRecord.target.dispatchEvent(new CustomEvent('disable', {
                       bubbles: false,
                       cancelable: false
                  }))
        
    })
})).observe(document.body, {
    attriubutes: true, 
    subtree: true
}).


С полифиллом будет ie9+. А
плюс без плагина вроде єтого вы не имеете возможности, чекнуть или сделать одно и с выше перечисленных состояний для групы чекбоксов
нет возможности стилизировать родителя, что часто требуется.
нельзя внутри label размещать input клик по label ставит у фокус, тригает клик или изменяет стан (как у случаи с чекбоксом) внутринего элемента формы, может наблюдатся у некоторых браузерах «двойной клик», если нужна такая структура, то надо в обработчику события клику по input написать event.stopPropagation()
нельзя стилизовать отца, а еще надо различные колбеки — что есть в этом плагине.
колбэки можно и нужно вешать на 'change' событие, так более, гхм, семантично, как минимум.
а стилизовать отца как-то тоже зло очень.
а если вам не надо чекать чекбокс при клике, а только когда придет ответ от сервера?
или же задизейблить
или в фокус поставить
и т. п.

этот плагин снабжен необходимыми методами.
<input type="checkbox" disabled>

input:disabled ~ {}


<input type="checkbox" checked>

input:checked ~ {}


<input type="checkbox" autofocus>

input:focus ~ {}


не вижу сути проблемы
А еще он борщ умеет варить.
Никто не говорит что плагин плох, но вам предложили более простое, лаконичное и семантически более верное решение.
Все остальные требования как, то: колбэки, «стилизовать отца» (надо бы запомнить фразу) и т.д., могут понадобиться, а могут и нет. Если они нужны они решаются элементарно в пару строчек JS.
требование простые и понятные чтобы всюду работало и без костылей.
Я же не опровергаю тот факт что хорошо смотрится решение на CSS + различные костыли, но я с самого начала написал о чем статья и какие возможности должны быть у представленного функционала.
Спасибо вам за труд.
Но я как-то привык делать нестандартные переключатели для форм через :checked, т.е. на гольном CSS.
А для IE7-8 checked-polyfill.
все они используют селекторы которые не работают в всех браузерах.
image
А для IE7-8 checked-polyfill.
Основная мысль моего комментария в том, что можно использовать вашу разработку как polyfill для старых браузеров, но в подавляющем большинстве современных браузеров данная задача проще и быстрее решается средствами CSS.
А как насчет комментариев ниже
но checked-polyfill не стилезирует задизейблены чекбоксы, чекбоксы в фокусе, задизейблены и чекнуты чекбоксы, чекбосы при навидении, чекбоксы в активном стане.
но, нет возможности стилизировать блок который обертывает чекбокс и label
А представте если вам надо чекнуть чекбокс после прихода ajax запроса.
С етим плагином можно ето сделать.
Нативными методами — нет.
В чем проблема его чекнуть как обычный чекбокс через JS?
но если вы на него нажмете то он автоматически изменится, а с имеющимися колбеками вы это сделаете правильно
Извините, не понимаю вас. Поясните, что вы имеете в виду?
если вы жмете на чекбокс то он изменяется, а если вам нужно чекнуть или анчекнуть чекбокс после того как придет ajax — запрос, с помощь метода trigger это можно сделать
И что? В чем проблема строчечку в js написать?
$('input').attr('checked');
но, если вы физически кликните на него то он изменится посредством браузера
Извините, какие вещества вы употребляли за последнее время? :D
например вам надо чтобы чекбокс чекнулся или же одержал какое то иное состояние после прихода ответа от сервера, если вы на него кликните левой кнопкой мышки то он изменится мгновенно — посредством браузера. А нам этого не надо!
return false вам о чем-нибудь говорит?
все правильно пишете, но если вам придется изменить состояние чекбокса, на

— чекнут
— не чекнут
— в фокусе
— задизейбленый
— задизейбленый и чекнутий
— чекнут и в фокусе

при этом дать какие то классы на него + на его родителя (что бы соотвествувало дизайну)
а сначало ище удалить все ненужные класы
Вы будете для этого писать велосипед, а зачем новый если есть старый

все что нужно написать:
$(‘.frame-checks-not-standart’).nStCheck();
preventDefault() в событии onclick вам ни о чем не говорит? Сначала запоминаем target при возникновении события, отправляем запрос на сервер и по возвращению меняем атрибут у target. Делов-то. Всегда задавался вопросом при мысли о таких плагинах — если плагин по каким-то причинам придётся отключить будет ли работать основной функционал чекбоксов? Если нет, то на помойку такой плагин — все события должны быть навешаны на чекбоксы, а плагин должен их всего лишь перехватывать, чтобы отображать состояние.
preventDefault(); — говорит как и retrun false;
Плагин рабатет при выключеном javascript-е. Описано как задача с самого начала статьи, и чуть ниже написано:

Класс b_n в стилях должен иметь правило background-image:none для того, чтобы при выключенном javascript-е сберечь стандартные чекбоксы.
я не про выключенный js говорил, а про выключенный плагин стилизации контролов. Я понимаю, что ситуация специфическая, но смысл в том, чтобы изначально все события привязывать к оригинальному контролу, а не эмулированному.
У вас есть функция checkChecked, которая устанавливает атрибут checked оригинальному контролу, но нет события change на этот контрол, поэтому я не смогу какой-то внешней функцией привязаться на onchange к оригинальному контролу, мне придется привязываться к специфичному nstcheck.cc. А если завтра по каким-то причинам мне придется отказаться от этого плагина или заменить его на другой? То всё, весь функционал рухнет, потому что был завязан на специфичные события несуществующего плагина?

В общем все это плохо, потому что вы лишаете разработчика стандартных методов работы с контролом и подсовываете свой велосипед предлагая весь функционал завязать на нём.
может я чего то не понял, но не обезательно привязываться примеру к nstcheck.cc, вы можете и далее обрабатывать change
здесь я дописал $('input').change(function(){alert(1)})
Не хочу показаться занудой, но это скорее называется non-standard checkboxes, так будет правильнее. Not Standart — слишком уж по-русски :)
Но и ваш в IE8 не работает.
там data-uri используется для картинки, если поставить физическую картинку все будет нормально.
jsfiddle ссылка из поста не работает. вижу одинаковые чекбоксы в обоях случаях
1 focus checked и 2 disabled, и 3 disabled and checked не работают как надо.
1. после снятия чека с бокса теряется фокус и больше не восстанавливается.
2. не видно что задизаблен чекбокс
3. можно снять галочку и поставить.
С disabled and checked можно снять галочку, просто покликав по другим и кликнув на него.
1,2 — там табиндексы прописаны,

2 — визуально не видно?
3 — поправил
2 — да, если чекбоксы без галочки, то активный от задисэйбленного не отличить.
В Internet Explorer 5.5 немножко сбоит верстка, нельзя ли поправить?
UFO just landed and posted this here
Ваши tabindex неправильно работают. Только что чекнутый чекбокс должен стать текущим и при нажатии на таб переходы должны с него начинаться.
Я только расставил номера табиндексов по порядку в HTML-коде. Все претензии к автору поста.
Вы написали: «поправил», ну я и подумал всякое…
UFO just landed and posted this here
209 строк не считая что ещё и жЫквери нужен.
Хорошо еще jquery ui здесь нет, а то всякое бывает…
И немного YUI для пряности.
этот плагин написан по потребности, а не чтоб навешать всего подряд, если вам етого не нужно то я за вас рад. Какое-то стихотворение вышло :)
Если используете почту Gmail там есть фильтр на фронте (http://prntscr.com/282n9o)

Там есть и подсвечевание родителя и элемента-обертки чекбокса (енужность которого так сильно оговаривалось здесь) и колбеки и изменение групы чекбоксов.

Конечно там не используются чекбоксы только в упрощенной версии, но суть таже.
Sign up to leave a comment.