[JQUERY] 어떻게 '크기 조정'이벤트의 '끝'을 기다리는 만 다음 작업을 수행?
JQUERY어떻게 '크기 조정'이벤트의 '끝'을 기다리는 만 다음 작업을 수행?
해결법
-
1.나는 다음과 같은 권고 운이 : http://forum.jquery.com/topic/the-resizeend-event
나는 다음과 같은 권고 운이 : http://forum.jquery.com/topic/the-resizeend-event
여기에 자신의 게시물의 링크 및 소스를 통해 발굴 할 필요가 없습니다 코드는 다음과 같습니다
var rtime; var timeout = false; var delta = 200; $(window).resize(function() { rtime = new Date(); if (timeout === false) { timeout = true; setTimeout(resizeend, delta); } }); function resizeend() { if (new Date() - rtime < delta) { setTimeout(resizeend, delta); } else { timeout = false; alert('Done resizing'); } }
코드에 대한 감사 sime.vidas!
-
2.당신은 ()에서는 setTimeout () 및 사항 clearTimeout을 사용할 수 있습니다
당신은 ()에서는 setTimeout () 및 사항 clearTimeout을 사용할 수 있습니다
function resizedw(){ // Haven't resized in 100ms! } var doit; window.onresize = function(){ clearTimeout(doit); doit = setTimeout(resizedw, 100); };
jsfiddle에 대한 코드 예제.
-
3.이것은 내가 @ 마크 콜맨 대답에 따라 작성하는 것이 코드입니다 :
이것은 내가 @ 마크 콜맨 대답에 따라 작성하는 것이 코드입니다 :
$(window).resize(function() { clearTimeout(window.resizedFinished); window.resizedFinished = setTimeout(function(){ console.log('Resized finished.'); }, 250); });
감사합니다 마크!
-
4.Internet Explorer에서 resizeEnd 이벤트를 제공합니다. 당신은 크기를 조정하는 동안 다른 브라우저 크기 조정 이벤트가 여러 번 트리거합니다.
Internet Explorer에서 resizeEnd 이벤트를 제공합니다. 당신은 크기를 조정하는 동안 다른 브라우저 크기 조정 이벤트가 여러 번 트리거합니다.
다른 큰 응답이 방법에서는 setTimeout과 .throttle를 사용하는 그 쇼가 여기에있다,
-
5.당신은 당신이 다음을 수행 할 수 있습니다 프로젝트에서 그것을 사용하는 경우, Underscore.js 그래서를 사용하여 우아한 해결책이 있습니다 -
당신은 당신이 다음을 수행 할 수 있습니다 프로젝트에서 그것을 사용하는 경우, Underscore.js 그래서를 사용하여 우아한 해결책이 있습니다 -
$( window ).resize( _.debounce( resizedw, 500 ) );
이 충분해야합니다 :)하지만, 당신이 더 많은 것을에 읽을 관심이 있다면, 당신은 내 블로그 게시물을 확인하실 수 있습니다 - http://rifatnabi.com/post/detect-end-of-jquery-resize-event-using-underscore -debounce (deadlink)
-
6.하나 개의 솔루션은 기능, 예컨대으로 jQuery를 확장하는 것입니다 : 크기 조정
하나 개의 솔루션은 기능, 예컨대으로 jQuery를 확장하는 것입니다 : 크기 조정
$.fn.resized = function (callback, timeout) { $(this).resize(function () { var $this = $(this); if ($this.data('resizeTimeout')) { clearTimeout($this.data('resizeTimeout')); } $this.data('resizeTimeout', setTimeout(callback, timeout)); }); };
샘플 사용 :
(myHandler가, 300) .resized $ (창)
-
7.당신은 어떤하여 setInterval 또는에서는 setTimeout에 대한 참조 ID를 저장할 수 있습니다. 이 같이 :
당신은 어떤하여 setInterval 또는에서는 setTimeout에 대한 참조 ID를 저장할 수 있습니다. 이 같이 :
var loop = setInterval(func, 30); // some time later clear the interval clearInterval(loop);
는 "글로벌"변수없이이 작업을 수행하려면 함수 자체에 로컬 변수를 추가 할 수 있습니다. 전의:
$(window).resize(function() { clearTimeout(this.id); this.id = setTimeout(doneResizing, 500); }); function doneResizing(){ $("body").append("<br/>done!"); }
-
8.당신은 jQuery.data와 함께에서는 setTimeout () 및 사항 clearTimeout ()를 사용할 수 있습니다 :
당신은 jQuery.data와 함께에서는 setTimeout () 및 사항 clearTimeout ()를 사용할 수 있습니다 :
$(window).resize(function() { clearTimeout($.data(this, 'resizeTimer')); $.data(this, 'resizeTimer', setTimeout(function() { //do something alert("Haven't resized in 200ms!"); }, 200)); });
최신 정보
나는 (바인드) -event 핸들러에 jQuery의 기본을 향상시키기 위해 확장을 썼다. 이 이벤트가 지정된 간격 동안 트리거되지 않은 경우 선택한 요소에 하나 개 이상의 이벤트에 대한 이벤트 핸들러 함수를 연결합니다. 당신이 resize 이벤트, 또는 다른 사람처럼, 오직 지연 후에 콜백을 발사하려는 경우에 유용합니다. https://github.com/yckart/jquery.unevent.js
;(function ($) { var methods = { on: $.fn.on, bind: $.fn.bind }; $.each(methods, function(k){ $.fn[k] = function () { var args = [].slice.call(arguments), delay = args.pop(), fn = args.pop(), timer; args.push(function () { var self = this, arg = arguments; clearTimeout(timer); timer = setTimeout(function(){ fn.apply(self, [].slice.call(arg)); }, delay); }); return methods[k].apply(this, isNaN(delay) ? arguments : args); }; }); }(jQuery));
또는 바인드 이벤트 핸들러 다른처럼 사용하여, 당신이 마지막으로 추가 매개 변수를 전달할 수 있다는 점을 제외하고 :
$(window).on('resize', function(e) { console.log(e.type + '-event was 200ms not triggered'); }, 200);
http://jsfiddle.net/ARTsinn/EqqHx/
-
9.계산보다 크기 조정 두 통화 사이의 델타 시간의 끝에서 함수를 실행하는 데 훨씬 더 간단한 방법이 있습니다, 단순히 이런 식으로 작업을 수행합니다
계산보다 크기 조정 두 통화 사이의 델타 시간의 끝에서 함수를 실행하는 데 훨씬 더 간단한 방법이 있습니다, 단순히 이런 식으로 작업을 수행합니다
var resizeId; $(window).resize(function() { clearTimeout(resizeId); resizeId = setTimeout(resizedEnded, 500); }); function resizedEnded(){ ... }
그리고 Angular2에 대해 동등한 :
private resizeId; @HostListener('window:resize', ['$event']) onResized(event: Event) { clearTimeout(this.resizeId); this.resizeId = setTimeout(() => { // Your callback method here. }, 500); }
각 방법의 경우, 그렇지 않으면 당신은 어떤 함수 호출을하거나이를 사용할 수 없습니다, 범위를 유지에서는 setTimeout의 () => {} 표기법을 사용합니다.
-
10.이것은 내가하는 검사 크기 조정의 시작에서 창 크기 기능을 추가 한, 위의 고언의 코드를 수정하고 크기가 마진보다 하나 크거나 작은 경우 (즉, 크기 조정의 끝에서 크기와 비교 예. 1000) 다음은 다시로드합니다.
이것은 내가하는 검사 크기 조정의 시작에서 창 크기 기능을 추가 한, 위의 고언의 코드를 수정하고 크기가 마진보다 하나 크거나 작은 경우 (즉, 크기 조정의 끝에서 크기와 비교 예. 1000) 다음은 다시로드합니다.
var rtime = new Date(1, 1, 2000, 12,00,00); var timeout = false; var delta = 200; var windowsize = $window.width(); var windowsizeInitial = $window.width(); $(window).on('resize',function() { windowsize = $window.width(); rtime = new Date(); if (timeout === false) { timeout = true; setTimeout(resizeend, delta); } }); function resizeend() { if (new Date() - rtime < delta) { setTimeout(resizeend, delta); return false; } else { if (windowsizeInitial > 1000 && windowsize > 1000 ) { setTimeout(resizeend, delta); return false; } if (windowsizeInitial < 1001 && windowsize < 1001 ) { setTimeout(resizeend, delta); return false; } else { timeout = false; location.reload(); } } windowsizeInitial = $window.width(); return false; }
-
11.마크 콜먼의 대답은 선택한 답변보다 훨씬 더 확실하게,하지만 당신은 시간 제한 ID (마크의 대답에 작은 동전 변수), 당신은 다음 중 하나를 수행 할 수 있습니다에 대한 전역 변수를 피하려는 경우 :
마크 콜먼의 대답은 선택한 답변보다 훨씬 더 확실하게,하지만 당신은 시간 제한 ID (마크의 대답에 작은 동전 변수), 당신은 다음 중 하나를 수행 할 수 있습니다에 대한 전역 변수를 피하려는 경우 :
(1) 폐쇄를 만들 즉시 호출 함수 표현식 (인생)을 사용합니다.
$(window).resize((function() { // This function is immediately invoked // and returns the closure function. var timeoutId; return function() { clearTimeout(timeoutId); timeoutId = setTimeout(function() { timeoutId = null; // You could leave this line out. // Code to execute on resize goes here. }, 100); }; })());
(2) 이벤트 핸들러 함수의 속성을 사용합니다.
$(window).resize(function() { var thisFunction = arguments.callee; clearTimeout(thisFunction.timeoutId); thisFunction.timeoutId = setTimeout(function() { thisFunction.timeoutId = null; // You could leave this line out. // Code to execute on resize goes here. }, 100); });
-
12.나는 내 자신에 약간의 래퍼 함수를 쓴 ...
나는 내 자신에 약간의 래퍼 함수를 쓴 ...
onResize = function(fn) { if(!fn || typeof fn != 'function') return 0; var args = Array.prototype.slice.call(arguments, 1); onResize.fnArr = onResize.fnArr || []; onResize.fnArr.push([fn, args]); onResize.loop = function() { $.each(onResize.fnArr, function(index, fnWithArgs) { fnWithArgs[0].apply(undefined, fnWithArgs[1]); }); }; $(window).on('resize', function(e) { window.clearTimeout(onResize.timeout); onResize.timeout = window.setTimeout("onResize.loop();", 300); }); };
여기에 사용법은 다음과 같습니다
var testFn = function(arg1, arg2) { console.log('[testFn] arg1: '+arg1); console.log('[testFn] arg2: '+arg2); }; // document ready $(function() { onResize(testFn, 'argument1', 'argument2'); });
-
13.
(function(){ var special = jQuery.event.special, uid1 = 'D' + (+new Date()), uid2 = 'D' + (+new Date() + 1); special.resizestart = { setup: function() { var timer, handler = function(evt) { var _self = this, _args = arguments; if (timer) { clearTimeout(timer); } else { evt.type = 'resizestart'; jQuery.event.handle.apply(_self, _args); } timer = setTimeout( function(){ timer = null; }, special.resizestop.latency); }; jQuery(this).bind('resize', handler).data(uid1, handler); }, teardown: function(){ jQuery(this).unbind( 'resize', jQuery(this).data(uid1) ); } }; special.resizestop = { latency: 200, setup: function() { var timer, handler = function(evt) { var _self = this, _args = arguments; if (timer) { clearTimeout(timer); } timer = setTimeout( function(){ timer = null; evt.type = 'resizestop'; jQuery.event.handle.apply(_self, _args); }, special.resizestop.latency); }; jQuery(this).bind('resize', handler).data(uid2, handler); }, teardown: function() { jQuery(this).unbind( 'resize', jQuery(this).data(uid2) ); } }; })(); $(window).bind('resizestop',function(){ //... });
-
14.그럼, 지금까지의 윈도우 매니저에 관한 한, 각 resize 이벤트는 자신의 메시지는 너무 기술적으로 창 크기를 조정할 때마다, 그것은 끝, 별개의 시작과 끝입니다.
그럼, 지금까지의 윈도우 매니저에 관한 한, 각 resize 이벤트는 자신의 메시지는 너무 기술적으로 창 크기를 조정할 때마다, 그것은 끝, 별개의 시작과 끝입니다.
어쩌면 당신은 당신의 계속에 지연을 설정할 가졌어요? 다음은 예입니다.
var t = -1; function doResize() { document.write('resize'); } $(document).ready(function(){ $(window).resize(function(){ clearTimeout(t); t = setTimeout(doResize, 1000); }); });
-
15.여기에 'resizestart'과 윈도우 객체에 'resizeend'이벤트 모두를 트리거하는 아주 간단한 스크립트입니다.
여기에 'resizestart'과 윈도우 객체에 'resizeend'이벤트 모두를 트리거하는 아주 간단한 스크립트입니다.
날짜와 시간에 주위를 깨끗이 할 필요가 없습니다.
는 D 변수가 크기 조정 종료 이벤트를 트리거하기 전에 크기 조정 이벤트 사이의 밀리 세컨드 수를 나타냅니다, 당신은 종료 이벤트가 얼마나 민감한 변경하려면이 함께 재생할 수 있습니다.
당신이 할 필요가있다 이러한 이벤트를 수신하려면 :
resizestart : $ (창) CSTE 연구진 ( 'resizestart', 기능 (이벤트) {을 console.log ( '! 크기 조정 시작');});
resizeend : $ (창) CSTE 연구진 ( 'resizeend', 기능 (이벤트) {을 console.log ( '크기 조정 끝!');});
(function ($) { var d = 250, t = null, e = null, h, r = false; h = function () { r = false; $(window).trigger('resizeend', e); }; $(window).on('resize', function (event) { e = event || e; clearTimeout(t); if (!r) { $(window).trigger('resizestart', e); r = true; } t = setTimeout(h, d); }); }(jQuery));
-
16.이것은,이 코드의 여러 위치에서 호출 할 수있는 내가 반복 작업을 지연하는 데 사용할 수 있습니다 :
이것은,이 코드의 여러 위치에서 호출 할 수있는 내가 반복 작업을 지연하는 데 사용할 수 있습니다 :
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); }; };
용법:
$(window).resize(function () { debounce(function() { //... }, 500); });
-
17.선택한 답변은 실제로 일을하지 않았다 .. 당신이 여기에 jQuery를 사용하지 않는 경우은 창 크기 조정과 함께 사용하는 방법에 대한 예 간단한 스로틀 기능이기 때문에
선택한 답변은 실제로 일을하지 않았다 .. 당신이 여기에 jQuery를 사용하지 않는 경우은 창 크기 조정과 함께 사용하는 방법에 대한 예 간단한 스로틀 기능이기 때문에
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(); }
-
18.내가 어떤 플러그인을 사용하지 않았다 이것은 나를 위해 일했다.
내가 어떤 플러그인을 사용하지 않았다 이것은 나를 위해 일했다.
$(window).resize(function() { var originalWindowSize = 0; var currentWidth = 0; var setFn = function () { originalWindowSize = $(window).width(); }; var checkFn = function () { setTimeout(function () { currentWidth = $(window).width(); if (currentWidth === originalWindowSize) { console.info("same? = yes") // execute code } else { console.info("same? = no"); // do nothing } }, 500) }; setFn(); checkFn(); });
윈도우의 폭을 얻는다 "setFn"호출 창을 다시 크기와 "originalWindowSize"다른 이름으로 저장. 다음은 500ms (또는 환경 설정) 후 현재 창 크기를 가져, 그들은 다음 창은 여전히 재 크기되고있는이 아닌 동일한 경우, 현재의 원래 비교 "checkFn"호출합니다. 생산에 콘솔 메시지를 제거하고, (옵션) "setFn"자기가 실행 할 수 있습니다 잊지 마세요.
-
19.
var resizeTimer; $( window ).resize(function() { if(resizeTimer){ clearTimeout(resizeTimer); } resizeTimer = setTimeout(function() { //your code here resizeTimer = null; }, 200); });
이것은 내가 크롬에서 일을하려고 무슨 일했다. 이는 지난 resize 이벤트 후 200 밀리 초까지 콜백을 발생하지 않습니다.
-
20.또한 내게로 만든 더 나은 대안은 여기에 있습니다 : https://stackoverflow.com/a/23692008/2829600 (지원 "삭제 기능")
또한 내게로 만든 더 나은 대안은 여기에 있습니다 : https://stackoverflow.com/a/23692008/2829600 (지원 "삭제 기능")
내가 실행의 지연을 처리하기 위해이 간단한 함수를 작성, 유용한 내부 jQuery를 .scroll ()와 .resize () callback_f 한 번만 특정 ID 문자열에 대한 실행됩니다 그래서.
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! */
-
21.http://jsfiddle.net/04fLy8t4/
http://jsfiddle.net/04fLy8t4/
나는 사용자 DOM 요소의 두 가지 이벤트를 삼각 함수를 구현 :
암호:
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") ); };
-
22.
var flag=true; var timeloop; $(window).resize(function(){ rtime=new Date(); if(flag){ flag=false; timeloop=setInterval(function(){ if(new Date()-rtime>100) myAction(); },100); } }) function myAction(){ clearInterval(timeloop); flag=true; //any other code... }
-
23.본인은 내 코드가 작동은 모르지만 정말 나를 위해 큰 일을 할 것. 나는 그의 버전은 나를 위해 일하지 않고 정말 누군가에게 도움이 될 것입니다 희망 때문에 고언 Antenucci 코드를 분석하여이 아이디어를 얻었다.
본인은 내 코드가 작동은 모르지만 정말 나를 위해 큰 일을 할 것. 나는 그의 버전은 나를 위해 일하지 않고 정말 누군가에게 도움이 될 것입니다 희망 때문에 고언 Antenucci 코드를 분석하여이 아이디어를 얻었다.
var tranStatus = false; $(window).resizeend(200, function(){ $(".cat-name, .category").removeAttr("style"); //clearTimeout(homeResize); $("*").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend",function(event) { tranStatus = true; }); processResize(); }); function processResize(){ homeResize = setInterval(function(){ if(tranStatus===false){ console.log("not yet"); $("*").one("webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend",function(event) { tranStatus = true; }); }else{ text_height(); clearInterval(homeResize); } },200); }
-
24.나는 어떤 resize 이벤트에 싸여 때 함수를 전달하는 기능을 썼다. 크기 조정도 지속적으로 타임 아웃 이벤트를 생성하지 않도록이 간격을 사용합니다. 이는 생산에서 제거되어야 로그 항목 이외 resize 이벤트 독립적으로 수행 할 수있다.
나는 어떤 resize 이벤트에 싸여 때 함수를 전달하는 기능을 썼다. 크기 조정도 지속적으로 타임 아웃 이벤트를 생성하지 않도록이 간격을 사용합니다. 이는 생산에서 제거되어야 로그 항목 이외 resize 이벤트 독립적으로 수행 할 수있다.
https://github.com/UniWrighte/resizeOnEnd/blob/master/resizeOnEnd.js
$(window).resize(function(){ //call to resizeEnd function to execute function on resize end. //can be passed as function name or anonymous function resizeEnd(function(){ }); }); //global variables for reference outside of interval var interval = null; var width = $(window).width(); var numi = 0; //can be removed in production function resizeEnd(functionCall){ //check for null interval if(!interval){ //set to new interval interval = setInterval(function(){ //get width to compare width2 = $(window).width(); //if stored width equals new width if(width === width2){ //clear interval, set to null, and call passed function clearInterval(interval); interval = null; //precaution functionCall(); } //set width to compare on next interval after half a second width = $(window).width(); }, 500); }else{ //logging that should be removed in production console.log("function call " + numi++ + " and inteval set skipped"); }
}
from https://stackoverflow.com/questions/5489946/how-to-wait-for-the-end-of-resize-event-and-only-then-perform-an-action by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] 때 CSS3 전환 완료 콜백 (0) | 2020.10.02 |
---|---|
[JQUERY] 당신은 어디에서 jQuery 라이브러리를 포함합니까? 구글 JSAPI? CDN? (0) | 2020.10.02 |
[JQUERY] jQuery.ajax 처리는 응답을 계속 : "성공" "되는 .done"대? (0) | 2020.10.02 |
[JQUERY] 아이폰 OS 6 Safari는 아약스 결과 $를 캐싱되어 있습니까? (0) | 2020.10.02 |
[JQUERY] 필수 필드 검증 JQuery와 팝업 MVC 4에서 작동하지 (0) | 2020.10.02 |