ResizeObserverController.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { scheduler, updateCount } from './utils/scheduler';
  2. import { ResizeObservation } from './ResizeObservation';
  3. import { ResizeObserverDetail } from './ResizeObserverDetail';
  4. import { resizeObservers } from './utils/resizeObservers';
  5. var observerMap = new WeakMap();
  6. var getObservationIndex = function (observationTargets, target) {
  7. for (var i = 0; i < observationTargets.length; i += 1) {
  8. if (observationTargets[i].target === target) {
  9. return i;
  10. }
  11. }
  12. return -1;
  13. };
  14. var ResizeObserverController = (function () {
  15. function ResizeObserverController() {
  16. }
  17. ResizeObserverController.connect = function (resizeObserver, callback) {
  18. var detail = new ResizeObserverDetail(resizeObserver, callback);
  19. observerMap.set(resizeObserver, detail);
  20. };
  21. ResizeObserverController.observe = function (resizeObserver, target, options) {
  22. var detail = observerMap.get(resizeObserver);
  23. var firstObservation = detail.observationTargets.length === 0;
  24. if (getObservationIndex(detail.observationTargets, target) < 0) {
  25. firstObservation && resizeObservers.push(detail);
  26. detail.observationTargets.push(new ResizeObservation(target, options && options.box));
  27. updateCount(1);
  28. scheduler.schedule();
  29. }
  30. };
  31. ResizeObserverController.unobserve = function (resizeObserver, target) {
  32. var detail = observerMap.get(resizeObserver);
  33. var index = getObservationIndex(detail.observationTargets, target);
  34. var lastObservation = detail.observationTargets.length === 1;
  35. if (index >= 0) {
  36. lastObservation && resizeObservers.splice(resizeObservers.indexOf(detail), 1);
  37. detail.observationTargets.splice(index, 1);
  38. updateCount(-1);
  39. }
  40. };
  41. ResizeObserverController.disconnect = function (resizeObserver) {
  42. var _this = this;
  43. var detail = observerMap.get(resizeObserver);
  44. detail.observationTargets.slice().forEach(function (ot) { return _this.unobserve(resizeObserver, ot.target); });
  45. detail.activeTargets.splice(0, detail.activeTargets.length);
  46. };
  47. return ResizeObserverController;
  48. }());
  49. export { ResizeObserverController };