utils.js 3.0 KB

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