JavaScript/JQuery: $(window).resize how to fire AFTER the resize is completed?

前端 未结 12 671
终归单人心
终归单人心 2020-11-22 08:54

I\'m using JQuery as such:

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

However, it appears that if the person manually resizes their browser wind

12条回答
  •  无人及你
    2020-11-22 09:45

    Simple jQuery plugin for delayed window resize event.

    SYNTAX:

    Add new function to resize event

    jQuery(window).resizeDelayed( func, delay, id ); // delay and id are optional
    

    Remove the function(by declaring its ID) added earlier

    jQuery(window).resizeDelayed( false, id );
    

    Remove all functions

    jQuery(window).resizeDelayed( false );
    

    USAGE:

    // ADD SOME FUNCTIONS TO RESIZE EVENT
    jQuery(window).resizeDelayed( function(){ console.log( 'first event - should run after 0.4 seconds'); }, 400,  'id-first-event' );
    jQuery(window).resizeDelayed( function(){ console.log('second event - should run after 1.5 seconds'); }, 1500, 'id-second-event' );
    jQuery(window).resizeDelayed( function(){ console.log( 'third event - should run after 3.0 seconds'); }, 3000, 'id-third-event' );
    
    // LETS DELETE THE SECOND ONE
    jQuery(window).resizeDelayed( false, 'id-second-event' );
    
    // LETS ADD ONE WITH AUTOGENERATED ID(THIS COULDNT BE DELETED LATER) AND DEFAULT TIMEOUT (500ms)
    jQuery(window).resizeDelayed( function(){ console.log('newest event - should run after 0.5 second'); } );
    
    // LETS CALL RESIZE EVENT MANUALLY MULTIPLE TIMES (OR YOU CAN RESIZE YOUR BROWSER WINDOW) TO SEE WHAT WILL HAPPEN
    jQuery(window).resize().resize().resize().resize().resize().resize().resize();
    

    USAGE OUTPUT:

    first event - should run after 0.4 seconds
    newest event - should run after 0.5 second
    third event - should run after 3.0 seconds
    

    PLUGIN:

    jQuery.fn.resizeDelayed = (function(){
    
        // >>> THIS PART RUNS ONLY ONCE - RIGHT NOW
    
        var rd_funcs = [], rd_counter = 1, foreachResizeFunction = function( func ){ for( var index in rd_funcs ) { func(index); } };
    
        // REGISTER JQUERY RESIZE EVENT HANDLER
        jQuery(window).resize(function() {
    
            // SET/RESET TIMEOUT ON EACH REGISTERED FUNCTION
            foreachResizeFunction(function(index){
    
                // IF THIS FUNCTION IS MANUALLY DISABLED ( by calling jQuery(window).resizeDelayed(false, 'id') ),
                // THEN JUST CONTINUE TO NEXT ONE
                if( rd_funcs[index] === false )
                    return; // CONTINUE;
    
                // IF setTimeout IS ALREADY SET, THAT MEANS THAT WE SHOULD RESET IT BECAUSE ITS CALLED BEFORE DURATION TIME EXPIRES
                if( rd_funcs[index].timeout !== false )
                    clearTimeout( rd_funcs[index].timeout );
    
                // SET NEW TIMEOUT BY RESPECTING DURATION TIME
                rd_funcs[index].timeout = setTimeout( rd_funcs[index].func, rd_funcs[index].delay );
    
            });
    
        });
    
        // <<< THIS PART RUNS ONLY ONCE - RIGHT NOW
    
        // RETURN THE FUNCTION WHICH JQUERY SHOULD USE WHEN jQuery(window).resizeDelayed(...) IS CALLED
        return function( func_or_false, delay_or_id, id ){
    
            // FIRST PARAM SHOULD BE SET!
            if( typeof func_or_false == "undefined" ){
    
                console.log( 'jQuery(window).resizeDelayed(...) REQUIRES AT LEAST 1 PARAMETER!' );
                return this; // RETURN JQUERY OBJECT
    
            }
    
            // SHOULD WE DELETE THE EXISTING FUNCTION(S) INSTEAD OF CREATING A NEW ONE?
            if( func_or_false == false ){
    
                // DELETE ALL REGISTERED FUNCTIONS?
                if( typeof delay_or_id == "undefined" ){
    
                    // CLEAR ALL setTimeout's FIRST
                    foreachResizeFunction(function(index){
    
                        if( typeof rd_funcs[index] != "undefined" && rd_funcs[index].timeout !== false )
                            clearTimeout( rd_funcs[index].timeout );
    
                    });
    
                    rd_funcs = [];
    
                    return this; // RETURN JQUERY OBJECT
    
                }
                // DELETE ONLY THE FUNCTION WITH SPECIFIC ID?
                else if( typeof rd_funcs[delay_or_id] != "undefined" ){
    
                    // CLEAR setTimeout FIRST
                    if( rd_funcs[delay_or_id].timeout !== false )
                        clearTimeout( rd_funcs[delay_or_id].timeout );
    
                    rd_funcs[delay_or_id] = false;
    
                    return this; // RETURN JQUERY OBJECT
    
                }
    
            }
    
            // NOW, FIRST PARAM MUST BE THE FUNCTION
            if( typeof func_or_false != "function" )
                return this; // RETURN JQUERY OBJECT
    
            // SET THE DEFAULT DELAY TIME IF ITS NOT ALREADY SET
            if( typeof delay_or_id == "undefined" || isNaN(delay_or_id) )
                delay_or_id = 500;
    
            // SET THE DEFAULT ID IF ITS NOT ALREADY SET
            if( typeof id == "undefined" )
                id = rd_counter;
    
            // ADD NEW FUNCTION TO RESIZE EVENT
            rd_funcs[id] = {
                func : func_or_false,
                delay: delay_or_id,
                timeout : false
            };
    
            rd_counter++;
    
            return this; // RETURN JQUERY OBJECT
    
        }
    
    })();
    

提交回复
热议问题