update-scroll.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. 'use strict';
  2. var instances = require('./instances');
  3. var upEvent = document.createEvent('Event')
  4. , downEvent = document.createEvent('Event')
  5. , leftEvent = document.createEvent('Event')
  6. , rightEvent = document.createEvent('Event')
  7. , yEvent = document.createEvent('Event')
  8. , xEvent = document.createEvent('Event')
  9. , xStartEvent = document.createEvent('Event')
  10. , xEndEvent = document.createEvent('Event')
  11. , yStartEvent = document.createEvent('Event')
  12. , yEndEvent = document.createEvent('Event')
  13. , lastTop
  14. , lastLeft;
  15. upEvent.initEvent('ps-scroll-up', true, true);
  16. downEvent.initEvent('ps-scroll-down', true, true);
  17. leftEvent.initEvent('ps-scroll-left', true, true);
  18. rightEvent.initEvent('ps-scroll-right', true, true);
  19. yEvent.initEvent('ps-scroll-y', true, true);
  20. xEvent.initEvent('ps-scroll-x', true, true);
  21. xStartEvent.initEvent('ps-x-reach-start', true, true);
  22. xEndEvent.initEvent('ps-x-reach-end', true, true);
  23. yStartEvent.initEvent('ps-y-reach-start', true, true);
  24. yEndEvent.initEvent('ps-y-reach-end', true, true);
  25. module.exports = function (element, axis, value) {
  26. if (typeof element === 'undefined') {
  27. throw 'You must provide an element to the update-scroll function';
  28. }
  29. if (typeof axis === 'undefined') {
  30. throw 'You must provide an axis to the update-scroll function';
  31. }
  32. if (typeof value === 'undefined') {
  33. throw 'You must provide a value to the update-scroll function';
  34. }
  35. if (axis === 'top' && value <= 0) {
  36. element.scrollTop = value = 0; // don't allow negative scroll
  37. element.dispatchEvent(yStartEvent);
  38. }
  39. if (axis === 'left' && value <= 0) {
  40. element.scrollLeft = value = 0; // don't allow negative scroll
  41. element.dispatchEvent(xStartEvent);
  42. }
  43. var i = instances.get(element);
  44. if (axis === 'top' && value >= i.contentHeight - i.containerHeight) {
  45. element.scrollTop = value = i.contentHeight - i.containerHeight; // don't allow scroll past container
  46. element.dispatchEvent(yEndEvent);
  47. }
  48. if (axis === 'left' && value >= i.contentWidth - i.containerWidth) {
  49. element.scrollLeft = value = i.contentWidth - i.containerWidth; // don't allow scroll past container
  50. element.dispatchEvent(xEndEvent);
  51. }
  52. if (!lastTop) {
  53. lastTop = element.scrollTop;
  54. }
  55. if (!lastLeft) {
  56. lastLeft = element.scrollLeft;
  57. }
  58. if (axis === 'top' && value < lastTop) {
  59. element.dispatchEvent(upEvent);
  60. }
  61. if (axis === 'top' && value > lastTop) {
  62. element.dispatchEvent(downEvent);
  63. }
  64. if (axis === 'left' && value < lastLeft) {
  65. element.dispatchEvent(leftEvent);
  66. }
  67. if (axis === 'left' && value > lastLeft) {
  68. element.dispatchEvent(rightEvent);
  69. }
  70. if (axis === 'top') {
  71. element.scrollTop = lastTop = value;
  72. element.dispatchEvent(yEvent);
  73. }
  74. if (axis === 'left') {
  75. element.scrollLeft = lastLeft = value;
  76. element.dispatchEvent(xEvent);
  77. }
  78. };