-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjquery.custom-radio-checkbox.js
145 lines (122 loc) · 6.6 KB
/
jquery.custom-radio-checkbox.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
Custom radio & checkbox jQuery plugin;
by N0r8 [email protected];
https://github.com/n0r8/Custom-radio-checkbox
usage:
$('your checkbox or radio selector').Custom({
customStyleClass:'classForcustomView',
customHeight:'height of checkbox or radio'
});
example:
$('input[type="checkbox"]').Custom({
customStyleClass:'checkbox',
customHeight:'16'
});
*/
(function ($) {
$.CustomData = {
elements:$()
};
$.fn.extend({
Custom:function (options) {
var elements = this;
$.CustomData.elements = $.CustomData.elements.add(elements);
/*Дефолтные значения параметров*/
var defaults = {
customStyleClass:"checkbox",
customHeight:"16",
enableHover:false
};
/*Заменяем дефолтные опции на переданные если таковые есть*/
options = $.extend(defaults, options);
/*Вид при нажатии на активный и неактивный элементы*/
var pushed = function () {
var element = $(this).children('input');
if (element.prop('checked')) {
/*смещения в спрайте*/
$(this).css('backgroundPosition', "0px -" + options.customHeight * 3 + "px");
} else {
$(this).css('backgroundPosition', "0px -" + options.customHeight + "px");
}
};
/*Отмечаем нажатый елемент все остальные сбрасываем, если они в групе(radio)*/
var check = function () {
var el = $(this);
var element = el.children('input');
if (element.prop('checked') && element.is(':checkbox')) {/*Отмеченный чекбокс*/
el.css('backgroundPosition', '0px 0px');
element.prop('checked', false).change();
/*Меняем атрибут на неотмеченный и вызываем событие смены состояния элемента*/
} else {
if (element.is(':checkbox')) {/*Неотмеченный чекбокс*/
el.css('backgroundPosition', "0px -" + options.customHeight * 2 + "px");
} else {
/*Радиобатоны*/
el.css('backgroundPosition', "0px -" + options.customHeight * 2 + "px");
$('input[name="' + element.attr('name') + '"]').not(element).parent().css('backgroundPosition', '0px 0px');
}
element.prop('checked', true).change();
}
};
/*Обновление картинки при клике по лейблу и загрузке документа*/
var update = function () {
$.CustomData.elements.each(function () { /*Проходим по всем елементам и проверяем их состояние*/
var el = $(this);
if (el.prop('checked')) {
el.parent().css('backgroundPosition', "0px -" + el.attr('data-height') * 2 + "px");
} else {
el.parent().css('backgroundPosition', "0px 0px");
}
});
};
/*Обновление при изменении состояния disabled/enabled */
var refresh = function () {
var el = $(this);
el.parent()[!el.prop('disabled') ? 'bind' : 'unbind']({mousedown:pushed, mouseup:check})[!el.prop('disabled') ? 'removeClass' : 'addClass']('disabled');
!el.prop('disabled') ? hoverBind(el) : $('label[for=' + el.attr('id') + ']').unbind("mouseenter.label").unbind("mouseout.label");
};
var hoverBind = function (element) {
var el = element;
var span = el.parent();
/*Hover is disabled by default*/
if (options.enableHover && !el.prop('disabled')) {
$('label[for=' + el.attr('id') + ']').bind({
"mouseenter.label":function () {
if (el.prop('checked')) {
span.css('backgroundPosition', "0px -" + el.attr('data-height') * 3 + "px");
} else {
span.css('backgroundPosition', "0px -" + el.attr('data-height') + "px");
}
},
"mouseout.label":function () {
if (el.prop('checked')) {
span.css('backgroundPosition', "0px -" + el.attr('data-height') * 2 + "px");
} else {
span.css('backgroundPosition', "0px 0px");
}
}
});
}
};
return this.each(function () {
var el = $(this);
if (el.attr('data-init') != '1') {
el.attr({'data-init':'1', 'data-height':options.customHeight}).wrap('<span/>');
/*Приписываем класс оформления переданный в параметрах*/
var span = el.parent().addClass(options.customStyleClass);
if (el.prop('checked')) { /*Задаем картинку еси элемент отмечен*/
span.css('backgroundPosition', "0px -" + (options.customHeight * 2) + "px");
}
hoverBind(el);
/*Бинд на изменение состояния элемента и кастомное событие для обновления после программного изменения состояния кнопки*/
el.bind({change:update, 'custom.refresh':refresh});
if (!el.prop('disabled')) {
span.parent('label').length ? span.bind({mousedown:pushed}) : span.bind({mousedown:pushed, mouseup:check});
} else {
span.addClass('disabled');
}
}
});
}
});
})(jQuery);