138 lines
3.2 KiB
JavaScript
138 lines
3.2 KiB
JavaScript
|
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);
|
||
|
};
|
||
|
})()
|
||
|
}
|
||
|
});
|
||
|
});
|