js监听元素尺寸变化

上代码: 

/**
 * @description 监听元素尺寸变化
 * @author: hruomei
 * @update
 * @date: 2021-07-22 11:29:40
 */

export default class ResizeObserver {
    constructor() {}

    static handleResize(e) {
        const trigger = e.target.__resizeTrigger__;

        if (!trigger) return;

        const handlers = trigger.__z_resizeListeners;
        if (handlers) {
            handlers.forEach(({ handler, context }) => {
                handler.apply(context, [e]);
            });
        }
    }

    static removeHandler(ele, handler, context) {
        const handlers = ele.__z_resizeListeners;

        if (!handlers) return;
        ele.__z_resizeListeners = handlers.filter(
            h => !(h.handler === handler && h.context === context)
        );
    }

    static createResizeTrigger(ele) {
        let obj = document.createElement('object');
        obj.setAttribute(
            'style',
            'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;'
        );
        obj.onload = ResizeObserver.handleObjectLoad;
        obj.type = 'text/html';
        ele.appendChild(obj);
        obj.data = 'about:blank';
        return obj;
    }

    static handleObjectLoad() {
        this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__;
        this.contentDocument.defaultView.addEventListener('resize', ResizeObserver.handleResize);
    }

    on(ele, handler, context) {
        if (!ele) throw new Error('illegal element')

        let handlers = ele.__z_resizeListeners;

        if (!handlers) {
            handlers = [];
            ele.__z_resizeListeners = handlers;

            if (window.getComputedStyle(ele, null).position === 'static') {
                ele.style.position = 'relative';
            }

            let obj = ResizeObserver.createResizeTrigger(ele);
            ele.__resizeTrigger__ = obj;
            obj.__resizeElement__ = ele;
        }

        handlers.push({
            handler,
            context
        });
    }

    off(ele, handler, context) {
        if (!ele) throw new Error('illegal element')

        let handlers = ele.__z_resizeListeners;

        if (!handlers) return;

        ResizeObserver.removeHandler(ele, handler, context);

        if (!handlers.length) {
            let trigger = ele.__resizeTrigger__;

            if (trigger) {
                trigger.contentDocument.defaultView.removeEventListener('resize', ResizeObserver.handleResize);
                ele.removeChild(trigger);
                delete ele.__resizeTrigger__;
            }

            delete ele.__z_resizeListeners;
        }
    }
}

用法:

 

const resizeObserver = new ResizeObserver();
const element = document.getElementById('netcallLeftWrapper');
const callback = () => {
    console.log('leftWrapper尺寸变化')
});

// 监听resize事件
resizeObserver.on(element, callback, this);

// 取消监听resize事件
resizeObserver.off(element, callback, this);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值