Browse Source

Added keyboard events.

pull/4212/head
Gareth Daunton 8 years ago
parent
commit
8bce752cf5
1 changed files with 160 additions and 62 deletions
  1. 222
      src/definitions/modules/range.js

222
src/definitions/modules/range.js

@ -44,7 +44,9 @@ $.fn.range = function(parameters) {
namespace = settings.namespace, namespace = settings.namespace,
input = settings.input, input = settings.input,
error = settings.error, error = settings.error,
keys = settings.keys,
isHover = false,
eventNamespace = '.' + namespace, eventNamespace = '.' + namespace,
moduleNamespace = 'module-' + namespace, moduleNamespace = 'module-' + namespace,
@ -57,6 +59,8 @@ $.fn.range = function(parameters) {
element = this, element = this,
instance = $module.data(moduleNamespace), instance = $module.data(moduleNamespace),
value,
position,
offset, offset,
precision, precision,
isTouch, isTouch,
@ -68,7 +72,7 @@ $.fn.range = function(parameters) {
initialize: function() { initialize: function() {
module.debug('Initializing range slider', settings); module.debug('Initializing range slider', settings);
isTouch = module.is.touch();
isTouch = module.setup.testOutTouch();
module.setup.layout(); module.setup.layout();
if(!module.is.disabled()) if(!module.is.disabled())
module.bind.events(); module.bind.events();
@ -89,7 +93,7 @@ $.fn.range = function(parameters) {
module.verbose('Destroying previous range for', $module); module.verbose('Destroying previous range for', $module);
clearInterval(instance.interval); clearInterval(instance.interval);
module.unbind.events(); module.unbind.events();
module.unbind.documentEvents();
module.unbind.slidingEvents();
$module.removeData(moduleNamespace); $module.removeData(moduleNamespace);
instance = undefined; instance = undefined;
}, },
@ -112,6 +116,14 @@ $.fn.range = function(parameters) {
} }
} }
}, },
testOutTouch: function() {
try {
document.createEvent('TouchEvent');
return true;
} catch (e) {
return false;
}
},
customLabel: function() { customLabel: function() {
var var
$children = $labels.find('.label'), $children = $labels.find('.label'),
@ -158,7 +170,18 @@ $.fn.range = function(parameters) {
bind: { bind: {
events: function() { events: function() {
// event listeners
module.bind.keyboardEvents();
module.bind.mouseEvents();
if(module.is.touch()) {
module.bind.touchEvents();
}
},
keyboardEvents: function() {
module.verbose('Binding keyboard events');
$(document).on('keydown' + eventNamespace, module.event.keydown);
},
mouseEvents: function() {
module.verbose('Binding mouse events');
$module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) { $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
event.stopImmediatePropagation(); event.stopImmediatePropagation();
event.preventDefault(); event.preventDefault();
@ -166,17 +189,25 @@ $.fn.range = function(parameters) {
module.event.down(event); module.event.down(event);
}); });
$module.on('mousedown' + eventNamespace, module.event.down); $module.on('mousedown' + eventNamespace, module.event.down);
if(module.is.touch()) {
$module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
event.stopImmediatePropagation();
event.preventDefault();
$(this).closest(".range").trigger('touchstart' + eventNamespace, event);
module.event.down(event);
});
$module.on('touchstart' + eventNamespace, module.event.down);
}
$module.on('mouseover' + eventNamespace, function() {
isHover = true;
});
$module.on('mouseout' + eventNamespace, function() {
isHover = false;
});
}, },
documentEvents: function() {
touchEvents: function() {
module.verbose('Binding touch events');
$module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
event.stopImmediatePropagation();
event.preventDefault();
$(this).closest(".range").trigger('touchstart' + eventNamespace, event);
module.event.down(event);
});
$module.on('touchstart' + eventNamespace, module.event.down);
},
slidingEvents: function() {
module.verbose('Binding page wide events while handle is being draged');
if(module.is.touch()) { if(module.is.touch()) {
$(document).on('touchmove' + eventNamespace, module.event.move); $(document).on('touchmove' + eventNamespace, module.event.move);
$(document).on('touchend' + eventNamespace, module.event.up); $(document).on('touchend' + eventNamespace, module.event.up);
@ -193,9 +224,12 @@ $.fn.range = function(parameters) {
$module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace); $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
$module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace); $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
$module.off('mousedown' + eventNamespace); $module.off('mousedown' + eventNamespace);
$module.off('mouseover' + eventNamespace);
$module.off('mouseout' + eventNamespace);
$module.off('touchstart' + eventNamespace); $module.off('touchstart' + eventNamespace);
$module.off('keydown' + eventNamespace);
}, },
documentEvents: function() {
slidingEvents: function() {
if(module.is.touch()) { if(module.is.touch()) {
$(document).off('touchmove' + eventNamespace); $(document).off('touchmove' + eventNamespace);
$(document).off('touchend' + eventNamespace); $(document).off('touchend' + eventNamespace);
@ -211,7 +245,7 @@ $.fn.range = function(parameters) {
down: function(event, originalEvent) { down: function(event, originalEvent) {
event.preventDefault(); event.preventDefault();
if(!module.is.disabled()) if(!module.is.disabled())
module.bind.documentEvents();
module.bind.slidingEvents();
}, },
move: function(event, originalEvent) { move: function(event, originalEvent) {
event.preventDefault(); event.preventDefault();
@ -232,11 +266,74 @@ $.fn.range = function(parameters) {
if(eventPos >= module.get.trackOffset() && eventPos <= module.get.trackOffset() + module.get.trackLength()) { if(eventPos >= module.get.trackOffset() && eventPos <= module.get.trackOffset() + module.get.trackLength()) {
module.set.valueMoveToValueBasedPosition(newPos); module.set.valueMoveToValueBasedPosition(newPos);
} }
module.unbind.documentEvents();
module.unbind.slidingEvents();
}, },
keydown: function(event) {
if(module.is.hover()) {
event.preventDefault();
var
key = event.which,
downArrow =
module.is.vertical()
?
module.is.reversed() ? keys.downArrow : keys.upArrow
:
keys.downArrow
,
upArrow =
module.is.vertical()
?
module.is.reversed() ? keys.upArrow : keys.downArrow
:
keys.upArrow
,
leftArrow =
!module.is.vertical()
?
module.is.reversed() ? keys.rightArrow : keys.leftArrow
:
keys.leftArrow
,
rightArrow =
!module.is.vertical()
?
module.is.reversed() ? keys.leftArrow : keys.rightArrow
:
keys.rightArrow
;
if(key == downArrow || key == leftArrow || key == keys.pageDown) {
module.backStep();
} else if(key == upArrow || key == rightArrow || key == keys.pageUp) {
module.takeStep();
}
}
}
},
takeStep: function() {
var
step = module.get.step(),
currValue = module.get.value()
;
module.verbose('Taking a step');
if(step > 0)
module.set.positionBasedValue(currValue + step);
},
backStep: function() {
var
step = module.get.step(),
currValue = module.get.value()
;
module.verbose('Going back a step');
if(step > 0)
module.set.positionBasedValue(currValue - step);
}, },
is: { is: {
hover: function() {
return isHover;
},
disabled: function() { disabled: function() {
return $module.hasClass(settings.className.disabled); return $module.hasClass(settings.className.disabled);
}, },
@ -250,17 +347,11 @@ $.fn.range = function(parameters) {
return $module.hasClass(settings.className.vertical); return $module.hasClass(settings.className.vertical);
}, },
touch: function () { touch: function () {
try {
document.createEvent('TouchEvent');
return true;
} catch (e) {
return false;
}
return isTouch;
}, },
}, },
get: { get: {
trackOffset: function() { trackOffset: function() {
if (module.is.vertical()) { if (module.is.vertical()) {
return $track.offset().top; return $track.offset().top;
@ -343,23 +434,8 @@ $.fn.range = function(parameters) {
return module.is.reversed() ? module.get.trackLength() - ($trackFill.position().left + $trackFill.width()) : $trackFill.position().left; return module.is.reversed() ? module.get.trackLength() - ($trackFill.position().left + $trackFill.width()) : $trackFill.position().left;
} }
}, },
value: function(position) {
var
startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),
endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),
ratio = (position - startPos) / (endPos - startPos),
range = module.get.max() - module.get.min(),
step = module.get.step(),
value = (ratio * range),
difference = (step == 0) ? value : Math.round(value / step) * step
;
module.verbose('Determined value based upon position: ' + position + ' as: ' + value);
if(value != difference) module.verbose('Rounding value to closest step: ' + difference);
// Use precision to avoid ugly Javascript floating point rounding issues
// (like 35 * .01 = 0.35000000000000003)
difference = Math.round(difference * precision) / precision;
module.verbose('Cutting off additional decimal places')
return difference - module.get.min();
value: function() {
return value;
} }
}, },
@ -391,11 +467,29 @@ $.fn.range = function(parameters) {
}, },
eventPos: function(event, originalEvent) { eventPos: function(event, originalEvent) {
if (module.is.vertical()) { if (module.is.vertical()) {
return isTouch ? originalEvent.originalEvent.touches[0].pageY : (typeof event.pageY != 'undefined') ? event.pageY : originalEvent.pageY;
return module.is.touch() ? originalEvent.originalEvent.touches[0].pageY : (typeof event.pageY != 'undefined') ? event.pageY : originalEvent.pageY;
} else { } else {
return isTouch ? originalEvent.originalEvent.touches[0].pageX : (typeof event.pageX != 'undefined') ? event.pageX : originalEvent.pageX;
return module.is.touch() ? originalEvent.originalEvent.touches[0].pageX : (typeof event.pageX != 'undefined') ? event.pageX : originalEvent.pageX;
} }
}, },
value: function(position) {
var
startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),
endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),
ratio = (position - startPos) / (endPos - startPos),
range = module.get.max() - module.get.min(),
step = module.get.step(),
value = (ratio * range),
difference = (step == 0) ? value : Math.round(value / step) * step
;
module.verbose('Determined value based upon position: ' + position + ' as: ' + value);
if(value != difference) module.verbose('Rounding value to closest step: ' + difference);
// Use precision to avoid ugly Javascript floating point rounding issues
// (like 35 * .01 = 0.35000000000000003)
difference = Math.round(difference * precision) / precision;
module.verbose('Cutting off additional decimal places')
return difference - module.get.min();
}
}, },
set: { set: {
@ -403,6 +497,7 @@ $.fn.range = function(parameters) {
if(input) { if(input) {
$(input).val(newValue); $(input).val(newValue);
} }
value = newValue;
settings.onChange.call(element, newValue); settings.onChange.call(element, newValue);
module.debug('Setting range value to ' + newValue); module.debug('Setting range value to ' + newValue);
}, },
@ -420,29 +515,30 @@ $.fn.range = function(parameters) {
$thumb.css({left: String(value - offset) + 'px'}); $thumb.css({left: String(value - offset) + 'px'});
$trackFill.css({width: String(value) + 'px'}); $trackFill.css({width: String(value) + 'px'});
} }
module.position = value;
position = value;
module.debug('Setting range position to ' + value); module.debug('Setting range position to ' + value);
}, },
positionBasedValue: function(value) { positionBasedValue: function(value) {
var var
min = module.get.min(), min = module.get.min(),
max = module.get.max()
max = module.get.max(),
position
; ;
if(value >= min && value <= max) { if(value >= min && value <= max) {
var position = module.determine.positionFromValue(value);
module.set.position(position);
module.set.value(value);
position = module.determine.positionFromValue(value);
} else if (value <= min) { } else if (value <= min) {
module.goto.min();
module.set.value(min);
position = module.determine.positionFromValue(min);
value = min;
} else { } else {
module.goto.max();
module.set.value(max);
position = module.determine.positionFromValue(max);
value = max;
} }
module.set.position(position);
module.set.value(value);
}, },
valueMoveToValueBasedPosition: function(position) { valueMoveToValueBasedPosition: function(position) {
var var
value = module.get.value(position),
value = module.determine.value(position),
min = module.get.min(), min = module.get.min(),
max = module.get.max(), max = module.get.max(),
pos pos
@ -458,7 +554,7 @@ $.fn.range = function(parameters) {
}, },
valueBasedPosition: function(position) { valueBasedPosition: function(position) {
var var
value = module.get.value(position),
value = module.determine.value(position),
min = module.get.min(), min = module.get.min(),
max = module.get.max() max = module.get.max()
; ;
@ -477,20 +573,13 @@ $.fn.range = function(parameters) {
goto: { goto: {
max: function() { max: function() {
module.set.position(module.get.trackEndPos());
module.set.positionBasedValue(module.get.max());
}, },
min: function() { min: function() {
module.set.position(module.get.trackStartPos());
module.set.positionBasedValue(module.get.min());
}, },
}, },
remove : {
state: function() {
module.verbose('Removing stored state');
delete module.value;
}
},
read: { read: {
metadata: function() { metadata: function() {
var var
@ -734,6 +823,15 @@ $.fn.range.settings = {
vertical : 'vertical' vertical : 'vertical'
}, },
keys : {
pageUp : 33,
pageDown : 34,
leftArrow : 37,
upArrow : 38,
rightArrow : 39,
downArrow : 40
},
labelTypes : { labelTypes : {
number : 'number', number : 'number',
none : 'none', none : 'none',

Loading…
Cancel
Save