UNPKG

rc-hooks

Version:
65 lines (64 loc) 2.75 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var ut2_1 = require("ut2"); // Minimum delay before invoking the update of observers. var REFRESH_DELAY = 50; // ref: https://github.com/que-etc/resize-observer-polyfill/blob/master/src/ResizeObserverController.js // A list of substrings of CSS properties used to find transition events that // might affect dimensions of observed elements. var transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight']; var defaultObserverOptions = { characterData: true, // 监视指定目标节点或子节点树中节点所包含的字符数据的变化 childList: true, // 观察目标子节点的变化,是否有添加或者删除 attributes: true, // 观察属性变动 subtree: true // 观察后代节点,默认为 false }; var ResizeObserver = /** @class */ (function () { function ResizeObserver(callback) { var _this = this; this.refresh = function () { if (_this.targetNode) { _this.callback([ { target: _this.targetNode } ], {}); } }; this.onTransitionEnd_ = function (_a) { var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b; var isReflowProperty = transitionKeys.some(function (key) { return propertyName.indexOf(key) > -1; }); if (isReflowProperty) { _this.throttleRefresh(); } }; this.observe = function (targetNode, options) { if (!ut2_1.isBrowser) { return; } _this.targetNode = targetNode; document.addEventListener('transitionend', _this.onTransitionEnd_); window.addEventListener('resize', _this.throttleRefresh); _this.observer.observe(document, tslib_1.__assign(tslib_1.__assign({}, defaultObserverOptions), options)); }; this.disconnect = function () { if (!ut2_1.isBrowser) { return; } _this.throttleRefresh.cancel(); _this.targetNode = null; document.removeEventListener('transitionend', _this.onTransitionEnd_); window.removeEventListener('resize', _this.throttleRefresh); _this.observer.disconnect(); }; this.throttleRefresh = (0, ut2_1.throttle)(this.refresh, REFRESH_DELAY); this.targetNode = null; this.callback = callback; this.observer = new MutationObserver(this.throttleRefresh); } return ResizeObserver; }()); exports.default = ResizeObserver;