form-fixrangechange.js
3.25 KB
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
webshims.register('form-fixrangechange', function($, webshims){
"use strict";
var rangeChange = {
trigger: function(e){
if(rangeChange.blockElement){
rangeChange.blockElement = false;
setTimeout(function(){
if(rangeChange.requestedChange && rangeChange.value != rangeChange.requestedChange.value){
$(rangeChange.requestedChange).trigger('change');
}
rangeChange.value = false;
}, 9);
}
},
lastValue: false,
updateInputValue: function(e){
rangeChange.lastValue = e.target.value;
},
triggerInput: function(e){
if(rangeChange.lastValue !== false && rangeChange.lastValue != e.target.value){
$(e.target).trigger('input');
}
},
inputTeardown: function(e){
$(e.target)
.off('input', rangeChange.updateInputValue)
.off('blur', rangeChange.inputTeardown)
;
rangeChange.lastValue = false;
},
inputSetup: function(e){
if(e.target.type == 'range'){
rangeChange.inputTeardown(e);
rangeChange.lastValue = e.target.value;
$(e.target)
.on('input', rangeChange.updateInputValue)
.on('blur', rangeChange.inputTeardown)
;
}
}
};
$.each([{name: 'key', evt: 'keyup'}, {name: 'mouse', evt: 'mouseup'}, {name: 'touch', evt: 'touchend'}], function(i, obj){
var setup = obj.name + 'Setup';
var commit = obj.name + 'Commit';
rangeChange[obj.name+'Block'] = function(e){
if(!rangeChange.blockElement && e.target.type == 'range'){
rangeChange.blockElement = e.target;
rangeChange.value = e.target.value;
$(rangeChange.blockElement)
.off('blur', rangeChange.trigger)
.on('blur', rangeChange.trigger)
;
$(document.body)
.off(obj.evt, rangeChange[commit])
.on(obj.evt, rangeChange[commit])
;
}
};
rangeChange[commit] = function(e){
$(document.body).off(obj.evt, rangeChange[commit]);
rangeChange.trigger();
};
});
$(document.body || 'html').on({
mousedown: rangeChange.mouseBlock,
'keydown kepress': function(e){
if(e.keyCode < 45 && e.keyCode > 30){
rangeChange.keyBlock(e);
}
},
'touchstart': rangeChange.touchBlock,
focusin: rangeChange.inputSetup
});
$.extend(true, $.event.special, {
change: {
handle: function(e){
if(!e.isTrigger && rangeChange.blockElement == e.target){
rangeChange.requestedChange = e.target;
rangeChange.triggerInput(e);
return false;
} else if(rangeChange.requestedChange == e.target){
rangeChange.requestedChange = false;
}
e.handleObj.handler.apply(this, arguments);
}
},
input: {
handle: (function(){
var lastValue, lastElement;
var remove = function(){
if(lastElement){
$(lastElement).off('change', remove);
}
lastValue = false;
lastElement = false;
};
var setup = function(e){
remove(e);
lastElement = e.target;
lastValue = e.target.value;
$(e.target).on('change', remove);
};
return function(e){
var value;
if(!e.isTrigger && e.target.type == 'range'){
if(lastElement != e.target){
setup(e);
} else if(lastElement == e.target){
if(lastValue == (value = e.target.value)){
return false;
}
lastValue = e.target.value;
}
}
e.handleObj.handler.apply(this, arguments);
};
})()
}
});
});