How to wait for the 'end' of 'resize' event and only then perform an action?

后端 未结 24 1211
深忆病人
深忆病人 2020-11-22 09:39

So I currently use something like:

$(window).resize(function(){resizedw();});

But this gets called many times while resizing process goes o

相关标签:
24条回答
  • 2020-11-22 10:04

    ResizeStart and ResizeEnd events for window

    http://jsfiddle.net/04fLy8t4/

    I implemented function which trig two events on user DOM element:

    1. resizestart
    2. resizeend

    Code:

    var resizeEventsTrigger = (function () {
        function triggerResizeStart($el) {
            $el.trigger('resizestart');
            isStart = !isStart;
        }
    
        function triggerResizeEnd($el) {
            clearTimeout(timeoutId);
            timeoutId = setTimeout(function () {
                $el.trigger('resizeend');
                isStart = !isStart;
            }, delay);
        }
    
        var isStart = true;
        var delay = 200;
        var timeoutId;
    
        return function ($el) {
            isStart ? triggerResizeStart($el) : triggerResizeEnd($el);
        };
    
    })();
    
    $("#my").on('resizestart', function () {
        console.log('resize start');
    });
    $("#my").on('resizeend', function () {
        console.log('resize end');
    });
    
    window.onresize = function () {
        resizeEventsTrigger( $("#my") );
    };
    
    0 讨论(0)
  • 2020-11-22 10:05

    UPDATE!

    Better alternative also created by me is here: https://stackoverflow.com/a/23692008/2829600 (supports "delete functions")

    ORIGINAL POST:

    I wrote this simple function for handling delay in execution, useful inside jQuery .scroll() and .resize() So callback_f will run only once for specific id string.

    function delay_exec( id, wait_time, callback_f ){
    
        // IF WAIT TIME IS NOT ENTERED IN FUNCTION CALL,
        // SET IT TO DEFAULT VALUE: 0.5 SECOND
        if( typeof wait_time === "undefined" )
            wait_time = 500;
    
        // CREATE GLOBAL ARRAY(IF ITS NOT ALREADY CREATED)
        // WHERE WE STORE CURRENTLY RUNNING setTimeout() FUNCTION FOR THIS ID
        if( typeof window['delay_exec'] === "undefined" )
            window['delay_exec'] = [];
    
        // RESET CURRENTLY RUNNING setTimeout() FUNCTION FOR THIS ID,
        // SO IN THAT WAY WE ARE SURE THAT callback_f WILL RUN ONLY ONE TIME
        // ( ON LATEST CALL ON delay_exec FUNCTION WITH SAME ID  )
        if( typeof window['delay_exec'][id] !== "undefined" )
            clearTimeout( window['delay_exec'][id] );
    
        // SET NEW TIMEOUT AND EXECUTE callback_f WHEN wait_time EXPIRES,
        // BUT ONLY IF THERE ISNT ANY MORE FUTURE CALLS ( IN wait_time PERIOD )
        // TO delay_exec FUNCTION WITH SAME ID AS CURRENT ONE
        window['delay_exec'][id] = setTimeout( callback_f , wait_time );
    }
    
    
    // USAGE
    
    jQuery(window).resize(function() {
    
        delay_exec('test1', 1000, function(){
            console.log('1st call to delay "test1" successfully executed!');
        });
    
        delay_exec('test1', 1000, function(){
            console.log('2nd call to delay "test1" successfully executed!');
        });
    
        delay_exec('test1', 1000, function(){
            console.log('3rd call to delay "test1" successfully executed!');
        });
    
        delay_exec('test2', 1000, function(){
            console.log('1st call to delay "test2" successfully executed!');
        });
    
        delay_exec('test3', 1000, function(){
            console.log('1st call to delay "test3" successfully executed!');
        });
    
    });
    
    /* RESULT
    3rd call to delay "test1" successfully executed!
    1st call to delay "test2" successfully executed!
    1st call to delay "test3" successfully executed!
    */
    
    0 讨论(0)
  • 2020-11-22 10:06

    Internet Explorer provides a resizeEnd event. Other browsers will trigger the resize event many times while you're resizing.

    There are other great answers here that show how to use setTimeout and the .throttle, .debounce methods from lodash and underscore, so I will mention Ben Alman's throttle-debounce jQuery plugin which accomplishes what you're after.

    Suppose you have this function that you want to trigger after a resize:

    function onResize() {
      console.log("Resize just happened!");
    };
    

    Throttle Example
    In the following example, onResize() will only be called once every 250 milliseconds during a window resize.

    $(window).resize( $.throttle( 250, onResize) );
    

    Debounce Example
    In the following example, onResize() will only be called once at the end of a window resizing action. This achieves the same result that @Mark presents in his answer.

    $(window).resize( $.debounce( 250, onResize) );
    
    0 讨论(0)
  • 2020-11-22 10:06

    since the selected answer didn't actually work .. and if you're not using jquery here is a simple throttle function with an example of how to use it with window resizing

        function throttle(end,delta) {
    
        var base = this;
    
        base.wait = false;
        base.delta = 200;
        base.end = end;
    
        base.trigger = function(context) {
    
            //only allow if we aren't waiting for another event
            if ( !base.wait ) {
    
                //signal we already have a resize event
                base.wait = true;
    
                //if we are trying to resize and we 
                setTimeout(function() {
    
                    //call the end function
                    if(base.end) base.end.call(context);
    
                    //reset the resize trigger
                    base.wait = false;
                }, base.delta);
            }
        }
    };
    
    var windowResize = new throttle(function() {console.log('throttle resize');},200);
    
    window.onresize = function(event) {
        windowResize.trigger();
    }
    
    0 讨论(0)
  • 2020-11-22 10:09

    This is the code that I write according to @Mark Coleman answer:

    $(window).resize(function() {
        clearTimeout(window.resizedFinished);
        window.resizedFinished = setTimeout(function(){
            console.log('Resized finished.');
        }, 250);
    });
    

    Thanks Mark!

    0 讨论(0)
  • 2020-11-22 10:10

    You can use setTimeout() and clearTimeout()

    function resizedw(){
        // Haven't resized in 100ms!
    }
    
    var doit;
    window.onresize = function(){
      clearTimeout(doit);
      doit = setTimeout(resizedw, 100);
    };
    

    Code example on jsfiddle.

    0 讨论(0)
提交回复
热议问题