programing

JavaScript/JQuery: $(창).크기 조정이 완료된 후 실행 방법을 조정하시겠습니까?

goodsources 2022. 11. 1. 00:04
반응형

JavaScript/JQuery: $(창).크기 조정이 완료된 후 실행 방법을 조정하시겠습니까?

JQuery를 다음과 같이 사용하고 있습니다.

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

창 하면 창 가장자리를 더 크게 또는 수 ..resize위의 이벤트는 여러 번 발생합니다.

질문:브라우저 창 크기 조정 완료 후 함수를 호출하려면 어떻게 해야 합니까? (이벤트가 한 번만 실행되도록)

다음은 코드 내의 여러 위치에서 호출할 수 있는 CMS 솔루션의 수정 내용입니다.

var waitForFinalEvent = (function () {
  var timers = {};
  return function (callback, ms, uniqueId) {
    if (!uniqueId) {
      uniqueId = "Don't call this twice without a uniqueId";
    }
    if (timers[uniqueId]) {
      clearTimeout (timers[uniqueId]);
    }
    timers[uniqueId] = setTimeout(callback, ms);
  };
})();

사용방법:

$(window).resize(function () {
    waitForFinalEvent(function(){
      alert('Resize...');
      //...
    }, 500, "some unique string");
});

의 1 콜 에서 윈도우되어 있는 , B 에 합니다.다만, 예를 들면, 코드의 다른 부분이 윈도 사이징에 대해서 다른 콜백을 설정하는 경우, 이러한 콜백이 공유되는 경우는, B/C에 실패합니다.timer★★★★★★ 。

이 변경에서는 각 콜백에 대해 하나의 ID를 지정합니다.이러한 고유 ID는 모든 타임아웃이벤트를 분리하기 위해 사용됩니다.

이벤트를 만드는 것을 선호합니다.

$(window).bind('resizeEnd', function() {
    //do something, window hasn't changed size in 500ms
});

작성 방법은 다음과 같습니다.

 $(window).resize(function() {
        if(this.resizeTO) clearTimeout(this.resizeTO);
        this.resizeTO = setTimeout(function() {
            $(this).trigger('resizeEnd');
        }, 500);
    });

글로벌 javascript 파일 어딘가에 있을 수 있습니다.

반복 작업을 지연시키기 위해 다음 기능을 사용합니다. 당신의 경우 효과가 있습니다.

var delay = (function(){
  var timer = 0;
  return function(callback, ms){
    clearTimeout (timer);
    timer = setTimeout(callback, ms);
  };
})();

사용방법:

$(window).resize(function() {
    delay(function(){
      alert('Resize...');
      //...
    }, 500);
});

전달된 콜백 함수는 지정된 시간이 경과한 후 지연에 대한 마지막 콜이 발생했을 때만 실행됩니다.그렇지 않으면 타이머가 리셋됩니다.사용자가 입력을 정지했을 때의 검출 등, 다른 목적에 도움이 됩니다.

Underscore.js가 설치되어 있는 경우 다음을 수행할 수 있습니다.

$(window).resize(_.debounce(function(){
    alert("Resized");
},500));

앞서 말한 솔루션 중 일부는 더 일반적인 사용법임에도 불구하고 나에게 효과가 없었습니다.또는 창 크기 조정 작업을 수행한 다음 항목을 찾았습니다.

$(window).bind('resize', function(e){
    window.resizeEvt;
    $(window).resize(function(){
        clearTimeout(window.resizeEvt);
        window.resizeEvt = setTimeout(function(){
        //code to do after window is resized
        }, 250);
    });
});

David Walsh에게 많은 감사를 표합니다. 여기 언더스코어 데바운스의 바닐라 버전이 있습니다.

코드:

// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
function debounce(func, wait, immediate) {
    var timeout;
    return function() {
        var context = this, args = arguments;
        var later = function() {
            timeout = null;
            if (!immediate) func.apply(context, args);
        };
        var callNow = immediate && !timeout;
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
        if (callNow) func.apply(context, args);
    };
};

간단한 사용법:

var myEfficientFn = debounce(function() {
    // All the taxing stuff you do
}, 250);

$(window).on('resize', myEfficientFn);

참고 자료: http://davidwalsh.name/javascript-debounce-function

사실, 제가 알기로는, 크기 조정이 해제되어 있을 때는 단순히 미래의 사용자의 동작을 모르기 때문에 몇 가지 작업을 수행할 수 없습니다.그러나 두 크기 조정 이벤트 사이에 시간이 경과했다고 가정할 수 있으므로 이 시간보다 조금 더 기다려도 크기가 변경되지 않으면 함수를 호출할 수 있습니다.
아이디어는 ''를 사용한다는 입니다.setTimeout아이디예를 들어, 2개의 크기 조정 이벤트 사이의 시간은 500ms이므로 750ms를 기다립니다.

var a;
$(window).resize(function(){
  clearTimeout(a);
  a = setTimeout(function(){
    // call your function
  },750);
});

글로벌하게 지연된 리스너 선언:

var resize_timeout;

$(window).on('resize orientationchange', function(){
    clearTimeout(resize_timeout);

    resize_timeout = setTimeout(function(){
        $(window).trigger('resized');
    }, 250);
});

그리고 아래에서는 청취자를 사용하여resized원하는 이벤트:

$(window).on('resized', function(){
    console.log('resized');
});

저는 좋아요.이 솔루션 보기 - https://alvarotrigo.com/blog/firing-resize-event-only-once-when-resizing-is-finished/

var resizeId;
$(window).resize(function() {
    clearTimeout(resizeId);
    resizeId = setTimeout(doneResizing, 500);
});
function doneResizing(){
    //whatever we want to do 
}

지연된 창 크기 조정 이벤트를 위한 단순 jQuery 플러그인입니다.

구문:

이벤트 크기를 조정할 새 기능 추가

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

이전에 추가한 함수(ID를 선언하여)를 제거합니다.

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

모든 기능 제거

jQuery(window).resizeDelayed( false );

용도:

// 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();

사용 상황 출력:

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

플러그인:

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

    }

})();

윈도우 크기 조정 후 마우스 커서가 문서로 돌아간다고 가정하면 온마우스오버 이벤트를 통해 콜백과 같은 동작을 만들 수 있습니다.이 솔루션은 터치스크린에서는 예상대로 작동하지 않을 수 있습니다.

var resizeTimer;
var resized = false;
$(window).resize(function() {
   clearTimeout(resizeTimer);
   resizeTimer = setTimeout(function() {
       if(!resized) {
           resized = true;
           $(document).mouseover(function() {
               resized = false;
               // do something here
               $(this).unbind("mouseover");
           })
       }
    }, 500);
});

다음은 제가 구현한 내용입니다.

$(표준)resize ( function ) { set Timeout ( some Function , 500 ) ;

set Timeout을 클리어 할 수 있습니다.크기가 다음 값보다 작을 것으로 예상되는 경우500ms

행운을 빈다...

다양한 솔루션mouuse 이벤트 후에 이벤트를 하려고 했기 때문에 창이 뜨자마자 새로고침을 추가했습니다.

jQuery(window).resize(function() {
        // this. is window
        if(  this.resizeTO) {
            clearTimeout(this.resizeTO) 
        };
    
         this.resizeTO = setTimeout(function() {
            
                jQuery(window).mouseenter(function() {
                    if( jQuery(window).width() < 700 &&   jQuery(window).width() > 400 ){
                        console.log("mouseenter  reloads elements"); 
                        // is loading the page  
                        location.reload();
                        //
                     }; // just mobile
                }); // mouse  fired    
        }, 400);  // set Time Ouuut
}); 



 

언급URL : https://stackoverflow.com/questions/2854407/javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed

반응형