UNPKG

bmfe-vue2-base

Version:

BM 后台系统基础框架

113 lines (92 loc) 3.25 kB
'use strict'; var instances = require('./instances'); var upEvent = document.createEvent('Event'); var downEvent = document.createEvent('Event'); var leftEvent = document.createEvent('Event'); var rightEvent = document.createEvent('Event'); var yEvent = document.createEvent('Event'); var xEvent = document.createEvent('Event'); var xStartEvent = document.createEvent('Event'); var xEndEvent = document.createEvent('Event'); var yStartEvent = document.createEvent('Event'); var yEndEvent = document.createEvent('Event'); var lastTop; var 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 = value = 0; // don't allow negative scroll element.dispatchEvent(yStartEvent); } if (axis === 'left' && value <= 0) { element.scrollLeft = value = 0; // don't allow negative scroll element.dispatchEvent(xStartEvent); } var i = instances.get(element); if (axis === 'top' && value >= i.contentHeight - i.containerHeight) { // don't allow scroll past container value = i.contentHeight - i.containerHeight; if (value - element.scrollTop <= 1) { // mitigates rounding errors on non-subpixel scroll values value = element.scrollTop; } else { element.scrollTop = value; } element.dispatchEvent(yEndEvent); } if (axis === 'left' && value >= i.contentWidth - i.containerWidth) { // don't allow scroll past container value = i.contentWidth - i.containerWidth; if (value - element.scrollLeft <= 1) { // mitigates rounding errors on non-subpixel scroll values value = element.scrollLeft; } else { element.scrollLeft = value; } element.dispatchEvent(xEndEvent); } 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); } };