Blame view

static/plugins/webshim-gh-pages/js-webshim/dev/shims/form-fixrangechange.js 3.25 KB
831eac332   zhuzhenchao   add file
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);
  				};
  			})()
  		}
  	});
  });