监听div的resize

  简单点说,就是:
     在被监听的 div 中添加 iframe 标签,设置其高宽均为 100%;
     在 iframe 的 resize 被触发时,则表明 div 的大小正在改变!

参考

Resize on div element 来源于stackoverflow 的回答

历程

日常开发中,遇到元素宽高改变时需要广播事件,由于此时窗口大小并未改变,故添加resize回调没用;而且该元素是因为某些dom隐藏,其高宽自适应所导致,而不是通过js设置,故 MutationObserver 也无法监听到。
上网找了找,对于div的resize事件的监听,实现方式有很多,比如:

基于jquery的小插件
通过object元素进行监听
scroll来监听元素resize
基于requestanimationframe的周期性检查

虽然是实现了对元素宽高的监听,但看上去很瓜。直到看到了stackoverflow 的回答...

代码

这是我们要监听的元素和样式

<style>
    .container {
        position: relative;
        width: 500px;
        height: 300px;
        background-color: black;
    }
</style>

<div class="container"></div>

模拟resize的函数,参数el为被监听的元素,cb为回调函数

function riseze (el, cb) {
    // 创建iframe标签,设置样式并插入到被监听元素中
    var iframe = document.createElement(‘iframe‘);
    iframe.setAttribute(‘class‘, ‘size-watch‘);
    el.appendChild(iframe);

    // 记录元素当前宽高
    var oldWidth = el.offsetWidth;
    var oldHeight = el.offsetHeight;

    // iframe 大小变化时的回调函数
    function sizeChange () {
        // 记录元素变化后的宽高
        var width = el.offsetWidth;
        var height = el.offsetHeight;
        // 不一致时触发回调函数 cb,并更新元素当前宽高
        if (width !== oldWidth || height !== oldHeight) {
            cb({width: width, height: height}, {width: oldWidth, height: oldHeight});
            oldWidth = width;
            oldHeight = height;
        }
    }

    // 设置定时器用于节流
    var timer = 0;
    // 将 sizeChange 函数挂载到 iframe 的resize回调中
    iframe.contentWindow.onresize = function () {
        clearTimeout(timer);
        timer = setTimeout(sizeChange, 20);
    };
}

这边是iframe的样式

.size-watch {
    width: 100%;
    height: 100%;
    position: absolute;
    visibility:hidden;
    margin: 0;
    padding: 0;
    border: 0;
}

测试

试一哈...

<script>
    var el = document.querySelector(‘.container‘);
    riseze(el, (val, oldVal) => {
        console.log(`size changed!new: ${JSON.stringify(val)}, old: ${JSON.stringify(oldVal)}`);
    });
</script>

结果就是这样子

溜溜球~

原文地址:https://www.cnblogs.com/qianduanwriter/p/11833879.html

时间: 2024-08-04 11:29:15

监听div的resize的相关文章

JQuery如何监听DIV内容变化

技术需求: 当Div内容发生变化生,需要监听事件,并执行指定的方法. 代码分解: #wb_follow_btn   是Div的id DOMNodeInserted  绑定监听方法 完整代码: $("#wb_follow_btn").bind('DOMNodeInserted', function(e) { alert('element now contains: ' + $(e.target).html()); });

vue 中监听窗口发生变化,触发监听事件, window.onresize &amp;&amp; window.addEventListener(&#39;resize&#39;,fn) ,window.onresize无效的处理方式

1 // 开始这样写,不执行 2 window.onresize = function() { 3 console.log('窗口发生变化') 4 } 5 6 7 // 改成window监听事件 8 window.addEventListener('resize', function() { 9 console.log('窗口发生变化') 10 }) onresize的定义方式 一.直接在html中定义 如<body onresize="doResize()"/> 二.直接

js对手机软键盘的监听

js还没有办法对手机软键盘直接进行监听的,但是可以有其他角度来判断软键盘是否弹起.比如输入框是否获取焦点等.focusin和focusout支持冒泡,对应focus和blur, 使用focusin和focusout的原因是focusin和focusout可以冒泡,focus和blur不会冒泡,这样就可以使用事件代理,处理多个输入框存在的情况. $(document).on('focusin', function () { //软键盘弹出的事件处理 }); $(document).on('focu

JS监听DOM结构变化

在做一个微博的接入,需要判断微博是否被关注,要检查微博标签的DIV是否有“已关注”的字符,但这个DIV的内容是微博JSSDK动态生成.$("#id").html()是获取不到我想要的内容.原因是当我们获取的时候内容还没有改变,所以获取不到,如果就想到监听这个DIV内容变化后,再来获取就个时候就能获取到了.于是产生新的问题,如何监听DIV的变化? 以下为监听DOM结构变化时的JS代码 $("#wb_follow_btn").bind('DOMNodeInserted'

通过jQuery实时监听表格行数变化

使用bootstrap table组件,当使用过滤器的时候,页面的表格行数发生变化,此时需要统计表格行数.想要监听表格变化,如何做呢? 使用场景:有一个表格里放着许多测试用例,当使用过滤器的时候表格中测试用例的数量发生了变化,此时要重新统计表格中的测试用例个数并反馈在页面上. 这里设:表格的tbody元素的id为monitorTbody,反馈测试用例个数的div的id是caseCount. 下面是两种实现的方法: // 实时监听DOM变化,方法1:jQuery监听div内容变化(控制台有报错)

Vue入门四、单个监听watch、深度监听deep、多个监听computed

watch单个监听computed多个监听当watch监听复杂数据类型的时候需要做深度监听deepwatch深度监听deep表达式: // 深度监听 watch:{ msg:{ handler(val, oldval){ if(val.text == 'love'){ alert('I Love You') } }, deep:true//开启深度监听 } } watch深度监听 <!DOCTYPE html> <html lang="en"> <head

vue中监听window.resize的变化

我只想说每个人遇到的bug真的不能一概而论,解决办法也会有不同.在vue中使用echarts的时候,会想要实现window.resize窗体变化大小的时候让图形大小跟着变化.实现的过程中各种bug,也真的让人有种想要发狂的感觉.但是还好,最后在不断的查资料和尝试当中.实现了想要的效果,仅供参考: 首先我这里实现的效果是切换echart图形,然后在window.resize过程中想要实现自适应窗口大小的变化. 这里的两个button分别是控制两个路由切换,也就是两个echart图形(柱状图和饼图)

ResizeObserver - 元素resize监听API

Motivation 响应式网站/Web应用程序 根据视口大小调整内容展示方式.这通常通过CSS和media查询来完成.当CSS表现不好我们会使用Javascript. 比如document.addEventListener("resize",fun)或者Element的onresize属性.通过监听window.resize事件,Javascript DOM操作与视口大小保持同步. 但你会意识到,这甚至不包括在窗口未被调整大小但元素改变其大小的情况.例如,添加新的子元素,设置元素的d

mui 左侧选项卡-div模式 的选项卡切换监听

使用$('#segmentedControls').on('change', '.mui-control-item', function () { })和 document.getElementById("segmentedControls").addEventListener('.mui-control-item', function (e) {})  都没有效果 后来使用querySelectorAll(".mui-control-item") 方法取所有类命为