-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjQuery.pairAttr.js
151 lines (124 loc) · 4.7 KB
/
jQuery.pairAttr.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
146
147
/*------------------------------
* attrChange selectors:
* value = value
* data-width = attribute
* id = attribute
* class = attribute
* class:myclass = single class selector
* css:style-property = single css style selector
*------------------------------*/
;(function ($, window, document, undefined) {
var addClass = $.fn.addClass;
$.fn.addClass = function () {
var result = addClass.apply(this, arguments);
this.trigger('attrChange', ['class']);
return result;
};
var removeClass = $.fn.removeClass;
$.fn.removeClass = function() {
var result = removeClass.apply(this, arguments);
this.trigger('attrChange', ['class']);
return result;
}
var change = $.fn.change;
$.fn.change = function () {
var result = change.apply(this, arguments);
this.trigger('attrChange', ['value']);
return result;
};
var attr = $.fn.attr;
$.fn.attr = function (attribute, value) {
var result = attr.apply(this, arguments);
if (value !== undefined) {
this.trigger('attrChange', [attribute]);
}
return result;
};
var css = $.fn.css;
$.fn.css = function(prop,value) {
var result = css.apply(this, arguments);
if (value !== undefined || typeof prop == 'object') {
this.trigger('attrChange');
}
return result;
};
$.pairAttr = function (options) {
for (var i in options) {
var element = i;
var selector = options[i];
$(element).data('pairAttr', {'element': element, 'selector': selector, elements: options});
//trigger attrChange if it's a form input
if (selector == 'value') {
$(element).bind('change', function() {
$(this).trigger('attrChange');
});
}
$(element).bind('attrChange.pairAttr', function() {
var data = $(this).data('pairAttr');
$.pairAttr.methods.log(data.element +" attrChange");
var myValue = $.pairAttr.methods.value($(data.element), data.selector);
$.pairAttr.methods.log(myValue);
//update values for all the other elements, if they have changed
for (var el in data.elements) {
var select = options[el];
if ($.pairAttr.methods.value(el, select) !== myValue) {
$.pairAttr.methods.value(el, select, myValue);
}
}
});
//trigger an attrChange intiially
$(element).trigger('attrChange');
}
};
$.pairAttr.debug = false;
$.pairAttr.methods = {
log: function(msg) {
if ($.pairAttr.debug) {
console.log(msg);
}
},
value: function(element, selector, value) {
if (value !== undefined) {
if (/^\d+$/.test(value)) {
var value = parseInt(value);
}
}
if (selector.indexOf('css:') != -1) {
//css property
var cssProp = selector.substr(4);
if (value == undefined) {
$.pairAttr.methods.log('returning css property: ' + cssProp);
return $(element).css(cssProp).replace('px', '');
}else {
$(element).css(cssProp, value);
}
}else if (selector.indexOf('class:') != -1) {
//class name
var className = selector.substr(6);
if (value == undefined) {
$.pairAttr.methods.log('returning class: ' + className);
return $(element).hasClass(className);
}else {
$(element).addClass(className);
}
}else if (selector == 'value') {
//form element value
var val = $(element).val();
if (value == undefined) {
$.pairAttr.methods.log('returning value: ' + val);
return val;
}else {
$(element).val(value);
}
}else {
//element attribute
var attr = $(element).attr(selector);
if (value == undefined) {
$.pairAttr.methods.log('returning ' + selector +' attribute: ' + attr);
}else {
$(element).attr(selector, value);
}
}
},
};
})(jQuery, window, document);