Resize on div element

前端 未结 11 1368
既然无缘
既然无缘 2020-11-28 08:31

jQuery has the resize() - event, but it just work with window.

jQuery(window).resize(function() { /* What ever */ });

This wor

11条回答
  •  攒了一身酷
    2020-11-28 08:55

    Just try this func (it may work not only for divs):

    function resized(elem, func = function(){}, args = []){
        elem = jQuery(elem);
        func = func.bind(elem);
        var h = -1, w = -1;
        setInterval(function(){
            if (elem.height() != h || elem.width() != w){
                h = elem.height();
                w = elem.width();
                func.apply(null, args);
            }
        }, 100);
    }
    

    You can use it like this

    resized(/*element*/ '.advs-columns-main > div > div', /*callback*/ function(a){
        console.log(a);
        console.log(this); //for accessing the jQuery element you passed
    }, /*callback arguments in array*/ ['I\'m the first arg named "a"!']);
    

    UPDATE: You can also use more progressive watcher (it can work for any objects, not only DOM elements):

    function changed(elem, propsToBeChanged, func = function(){}, args = [], interval = 100){
            func = func.bind(elem);
            var currentVal = {call: {}, std: {}};
            $.each(propsToBeChanged, (property, needCall)=>{
                needCall = needCall ? 'call' : 'std';
                currentVal[needCall][property] = new Boolean(); // is a minimal and unique value, its equivalent comparsion with each other will always return false
            });
            setInterval(function(){
                $.each(propsToBeChanged, (property, needCall)=>{
                    try{
                        var currVal = needCall ? elem[property]() : elem[property];
                    } catch (e){ // elem[property] is not a function anymore
                        var currVal = elem[property];
                        needCall = false;
                        propsToBeChanged[property] = false;
                    }
                    needCall = needCall ? 'call' : 'std';
                    if (currVal !== currentVal[needCall][property]){
                        currentVal[needCall][property] = currVal;
                        func.apply(null, args);
                    }
                });
            }, interval);
        }
    

    Just try it:

    var b = '2',
        a = {foo: 'bar', ext: ()=>{return b}};
    changed(a, {
    // prop name || do eval like a function?
        foo:        false,
        ext:        true
    }, ()=>{console.log('changed')})
    

    It will log 'changed' every time when you change b, a.foo or a.ext directly

提交回复
热议问题