utils.js 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.addObserveTarget = addObserveTarget;
  7. exports.getFixedBottom = getFixedBottom;
  8. exports.getFixedTop = getFixedTop;
  9. exports.getObserverEntities = getObserverEntities;
  10. exports.getTargetRect = getTargetRect;
  11. exports.removeObserveTarget = removeObserveTarget;
  12. var _addEventListener = _interopRequireDefault(require("../vc-util/Dom/addEventListener"));
  13. var _supportsPassive = _interopRequireDefault(require("../_util/supportsPassive"));
  14. function getTargetRect(target) {
  15. return target !== window ? target.getBoundingClientRect() : {
  16. top: 0,
  17. bottom: window.innerHeight
  18. };
  19. }
  20. function getFixedTop(placeholderReact, targetRect, offsetTop) {
  21. if (offsetTop !== undefined && targetRect.top > placeholderReact.top - offsetTop) {
  22. return "".concat(offsetTop + targetRect.top, "px");
  23. }
  24. return undefined;
  25. }
  26. function getFixedBottom(placeholderReact, targetRect, offsetBottom) {
  27. if (offsetBottom !== undefined && targetRect.bottom < placeholderReact.bottom + offsetBottom) {
  28. var targetBottomOffset = window.innerHeight - targetRect.bottom;
  29. return "".concat(offsetBottom + targetBottomOffset, "px");
  30. }
  31. return undefined;
  32. }
  33. // ======================== Observer ========================
  34. var TRIGGER_EVENTS = ['resize', 'scroll', 'touchstart', 'touchmove', 'touchend', 'pageshow', 'load'];
  35. var observerEntities = [];
  36. function getObserverEntities() {
  37. // Only used in test env. Can be removed if refactor.
  38. return observerEntities;
  39. }
  40. function addObserveTarget(target, affix) {
  41. if (!target) return;
  42. var entity = observerEntities.find(function (item) {
  43. return item.target === target;
  44. });
  45. if (entity) {
  46. entity.affixList.push(affix);
  47. } else {
  48. entity = {
  49. target: target,
  50. affixList: [affix],
  51. eventHandlers: {}
  52. };
  53. observerEntities.push(entity);
  54. // Add listener
  55. TRIGGER_EVENTS.forEach(function (eventName) {
  56. entity.eventHandlers[eventName] = (0, _addEventListener.default)(target, eventName, function () {
  57. entity.affixList.forEach(function (targetAffix) {
  58. var lazyUpdatePosition = targetAffix.exposed.lazyUpdatePosition;
  59. lazyUpdatePosition();
  60. }, (eventName === 'touchstart' || eventName === 'touchmove') && _supportsPassive.default ? {
  61. passive: true
  62. } : false);
  63. });
  64. });
  65. }
  66. }
  67. function removeObserveTarget(affix) {
  68. var observerEntity = observerEntities.find(function (oriObserverEntity) {
  69. var hasAffix = oriObserverEntity.affixList.some(function (item) {
  70. return item === affix;
  71. });
  72. if (hasAffix) {
  73. oriObserverEntity.affixList = oriObserverEntity.affixList.filter(function (item) {
  74. return item !== affix;
  75. });
  76. }
  77. return hasAffix;
  78. });
  79. if (observerEntity && observerEntity.affixList.length === 0) {
  80. observerEntities = observerEntities.filter(function (item) {
  81. return item !== observerEntity;
  82. });
  83. // Remove listener
  84. TRIGGER_EVENTS.forEach(function (eventName) {
  85. var handler = observerEntity.eventHandlers[eventName];
  86. if (handler && handler.remove) {
  87. handler.remove();
  88. }
  89. });
  90. }
  91. }