scroll, resize, input, mousemove ๊ฐ์ ์ด๋ฒคํธ๋ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ฏ๋ก ์ด๋ฌํ ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉํ ํธ๋ค๋ฌ๋ ๊ณผ๋ํ๊ฒ ํธ์ถ๋์ด โโ์ฑ๋ฅ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋คโโ
์ค๋กํ๊ณผ ๋๋ฐ์ด์ค๋ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด์ ๊ณผ๋ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ํธ์ถ์ ๋ฐฉ์งํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์
๋๋ค
๋๋ฐ์ด์ค๋ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐ์ํด์ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ง ์๋ค๊ฐ ์ผ์ ์๊ฐ์ด ๊ฒฝ๊ณผํ ์ดํ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ๋ฒ์ ํธ์ถ๋๋๋ก ํฉ๋๋ค. ์ฆ, ๋๋ฐ์ด์ค๋ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด์ ๋ง์ง๋ง์ ํ๋ฒ๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋๋ก ํ๋ค
<--> : delaytime
-
๊ฒ์ ํ ๋
: input ์ด๋ฒคํธ๋ ์ฌ์ฉ์๊ฐ ํ ์คํธ ์ ๋ ฅ ํ๋์ ๊ฐ์ ์ ๋ ฅํ ๋ ๋ง๋ค ์ฐ์ํด์ ๋ฐ์ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฒ์์ฐฝ์ ํ๊ธ์ ํ๊ธ์ ์น ๋๋ง๋ค Ajax ์์ฒญ๊ณผ ๊ฐ์ ๋ฌด๊ฑฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ์๋ฃํ์ง ์์์ด๋ Ajax์์ฒญ์ด ์ ์ก๋ ์ ์๊ณ ์ด๋ ์๋ฒ์๋ ๋ถ๋ด์ ์ค์ ์์ต๋๋คโโ
๋ฐ๋ผ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅ์ ์๋ฃํ์ ๋ ํ๋ฒ๋ง Ajax ์์ฒญ์ ์ ์กํ๋ ๊ฒ์ด ์ข์ต๋๋ค. => ์ผ์ ์๊ฐ๋์ ํ ์คํธ ์ ๋ ฅํ๋์ ๊ฐ์ ์ ๋ ฅ ํ์ง ์์ผ๋ฉด ์ ๋ ฅ์ด ์๋ฃ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค!
-
ํ๋ฉด resizing ํ ๋
: debounce๋ฅผ ์ฌ์ฉํ์ง ์๋ resize ์ด๋ฒคํธ๋ ํ๋ฉด์ ์ฌ์ด์ฆ๋ฅผ ๋ณ๊ฒฐํ ๋๋ง๋ค ๊ธฐ๋กํ์ง๋ง, debounce๋ฅผ ์ฌ์ฉํ๋ฉด resize์ด๋ฒคํธ์ ๋ง์ง๋ง์ ์ถ์ ํด์ ์ฌ์ด์ฆ๋ฅผ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค!
$(document).ready(function(){ var $win = $(window); var $left_panel = $('.left-panel'); var $right_panel = $('.right-panel'); function display_info($div) { $div.append($win.width() + ' x ' + $win.height() + '<br>'); } $(window).on('resize', function(){ display_info($left_panel); }); $(window).on('resize', _.debounce(function() { display_info($right_panel); }, 400)); });
๐ ์ด์ฒ๋ผ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐ์ํด์ ๋ฐ์ํ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ง ์๋ค๊ฐ ์ผ์ ์๊ฐ ๋์ ์ด๋ฒคํธ๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ ๋ฒ๋ง!! ํธ์ถ๋๋๋ก ํ๋ ๊ฒ์ด debounce ์
๋๋ค!
์ค๋กํ์ ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์ฐ์ํด์ ๋ฐ์ํ๋๋ผ๋ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์ต๋ ํ ๋ฒ๋ง!! ํธ์ถ ๋๋๋ก ํฉ๋๋ค. ์ฆ, ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํ ํด์ ์ผ์ ์๊ฐ ๋จ์๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋๋ก ํธ์ถ ์ฃผ๊ธฐ๋ฅผ ๋ง๋ญ๋๋ค.
-
๋ฌดํ ์คํฌ๋กค(Infinite Scrolling)
: ์ฌ์ฉ์๊ฐ footer ์์ ์ผ๋ง๋ ๋จ์ด์ ธ ์๋์ง ํ์ธํด์ผํ๊ณ ์ฌ์ฉ์๊ฐ ๋งจ ์๋๋ก ์คํฌ๋กค ํ๋ค๋ฉด Ajax ๋ฅผ ํตํด ๋ ๋ง์ ์ฝํ ์ธ ๋ฅผ ์์ฒญํ์ฌ ํ์ด์ง์ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์ debouncing ์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ๋ฉ์ถ๋๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฏ๋ก,
์ฃผ๊ธฐ์ ์ผ๋ก ์ฌ์ฉ์์ ์์น๋ฅผ ํ์ ํ๋ ํจ์๋ฅผ ์คํํ๊ธฐ ์ํด throttling์ ์ฌ์ฉํฉ๋๋ค!$(document).ready(function(){ $(document).on('scroll', _.throttle(function(){ check_if_needs_more_content(); }, 300)); function check_if_needs_more_content() { pixelsFromWindowBottomToBottom = 0 + $(document).height() - $(window).scrollTop() -$(window).height(); if (pixelsFromWindowBottomToBottom < 200){ // Here it would go an ajax request $('body').append($('.item').clone()); } } });
๐ ์์ ์์ ์์ Thtottling ์์ด scroll ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ฉด ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ ๋๋ง๋ค ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์งง์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฐ์ํด์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ทธ๋ฃนํํด์ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด Throttling ์
๋๋ค!
์ ์ผ ํฐ ์ฐจ์ด์ ์ ์ค๋กํ์ ์ ์ด๋ X๋ฐ๋ฆฌ ์ด๋ง๋ค ์ ๊ธฐ์ ์ผ๋ก ๊ธฐ๋ฅ ์คํ์ ๋ณด์ฅํ๋ค๋ ๊ฒ ์
๋๋ค! Debounce๋ ์๋ฌด๋ฆฌ ๋ง์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋ ๋ชจ๋ ๋ฌด์ํ๊ณ **ํน์ ์๊ฐ ์ฌ์ด์ ์ด๋ค ์ด๋ฒคํธ๋ ๋ฐ์ํ์ง ์์์ ๋ ๋ฑ ํ๋ฒ๋ง ๋ง์ง๋ง ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๊ธฐ๋ฒ**์
๋๋ค. ๋ฐ๋ผ์ ์ผ์ ์๊ฐ์ด ์ง๋๊ธฐ ์ ์ ๊ณ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ฝ๋ฐฑ์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ ๋ฐ์ํ์ง ์๊ณ โโ๊ณ์ ๋ฌด์๋ฉ๋๋คโโ
var inside1 = $(".inside-1");
var thing1 = $(".thing-1");
var count1 = $(".count-1");
inside1.on('scroll', function() {
thing1.css("top", inside1[0].scrollTop);
count1.html(parseInt(count1.html())+1);
});
// 2
var inside2 = $(".inside-2");
var thing2 = $(".thing-2");
var count2 = $(".count-2");
inside2.on('scroll', _.throttle(function() {
thing2.css("top", inside2[0].scrollTop);
count2.html(parseInt(count2.html())+1);
}, 150));
// 3
var inside3 = $(".inside-3");
var thing3 = $(".thing-3");
var count3 = $(".count-3");
inside3.on('scroll', _.debounce(function() {
thing3.css("top", inside3[0].scrollTop);
count3.html(parseInt(count3.html())+1);
}, 100));https://lodash.com/docs/4.17.15#throttle

