106 lines
2.9 KiB
JavaScript
106 lines
2.9 KiB
JavaScript
/* Copyright (c) 2015 Hyunje Alex Jun and other contributors
|
|
* Licensed under the MIT License
|
|
*/
|
|
'use strict';
|
|
|
|
var instances = require('./instances');
|
|
|
|
var upEvent = document.createEvent('Event')
|
|
, downEvent = document.createEvent('Event')
|
|
, leftEvent = document.createEvent('Event')
|
|
, rightEvent = document.createEvent('Event')
|
|
, yEvent = document.createEvent('Event')
|
|
, xEvent = document.createEvent('Event')
|
|
, xStartEvent = document.createEvent('Event')
|
|
, xEndEvent = document.createEvent('Event')
|
|
, yStartEvent = document.createEvent('Event')
|
|
, yEndEvent = document.createEvent('Event')
|
|
, lastTop
|
|
, lastLeft;
|
|
|
|
upEvent.initEvent('ps-scroll-up', true, true);
|
|
downEvent.initEvent('ps-scroll-down', true, true);
|
|
leftEvent.initEvent('ps-scroll-left', true, true);
|
|
rightEvent.initEvent('ps-scroll-right', true, true);
|
|
yEvent.initEvent('ps-scroll-y', true, true);
|
|
xEvent.initEvent('ps-scroll-x', true, true);
|
|
xStartEvent.initEvent('ps-x-reach-start', true, true);
|
|
xEndEvent.initEvent('ps-x-reach-end', true, true);
|
|
yStartEvent.initEvent('ps-y-reach-start', true, true);
|
|
yEndEvent.initEvent('ps-y-reach-end', true, true);
|
|
|
|
module.exports = function (element, axis, value) {
|
|
if (typeof element === 'undefined') {
|
|
throw 'You must provide an element to the update-scroll function';
|
|
}
|
|
|
|
if (typeof axis === 'undefined') {
|
|
throw 'You must provide an axis to the update-scroll function';
|
|
}
|
|
|
|
if (typeof value === 'undefined') {
|
|
throw 'You must provide a value to the update-scroll function';
|
|
}
|
|
|
|
if (axis === 'top' && value <= 0) {
|
|
element.scrollTop = 0;
|
|
element.dispatchEvent(yStartEvent);
|
|
return; // don't allow negative scroll
|
|
}
|
|
|
|
if (axis === 'left' && value <= 0) {
|
|
element.scrollLeft = 0;
|
|
element.dispatchEvent(xStartEvent);
|
|
return; // don't allow negative scroll
|
|
}
|
|
|
|
var i = instances.get(element);
|
|
|
|
if (axis === 'top' && value >= i.contentHeight - i.containerHeight) {
|
|
element.scrollTop = i.contentHeight - i.containerHeight;
|
|
element.dispatchEvent(yEndEvent);
|
|
return; // don't allow scroll past container
|
|
}
|
|
|
|
if (axis === 'left' && value >= i.contentWidth - i.containerWidth) {
|
|
element.scrollLeft = i.contentWidth - i.containerWidth;
|
|
element.dispatchEvent(xEndEvent);
|
|
return; // don't allow scroll past container
|
|
}
|
|
|
|
if (!lastTop) {
|
|
lastTop = element.scrollTop;
|
|
}
|
|
|
|
if (!lastLeft) {
|
|
lastLeft = element.scrollLeft;
|
|
}
|
|
|
|
if (axis === 'top' && value < lastTop) {
|
|
element.dispatchEvent(upEvent);
|
|
}
|
|
|
|
if (axis === 'top' && value > lastTop) {
|
|
element.dispatchEvent(downEvent);
|
|
}
|
|
|
|
if (axis === 'left' && value < lastLeft) {
|
|
element.dispatchEvent(leftEvent);
|
|
}
|
|
|
|
if (axis === 'left' && value > lastLeft) {
|
|
element.dispatchEvent(rightEvent);
|
|
}
|
|
|
|
if (axis === 'top') {
|
|
element.scrollTop = lastTop = value;
|
|
element.dispatchEvent(yEvent);
|
|
}
|
|
|
|
if (axis === 'left') {
|
|
element.scrollLeft = lastLeft = value;
|
|
element.dispatchEvent(xEvent);
|
|
}
|
|
|
|
};
|