๐จ JavaScript/๊ฐ๋
[์ฝ๋ฉ์ ํ,mdn ๋ฑ] ์ด๋ฒคํธ๋ฒ๋ธ๋ง๊ณผ ์ด๋ฒคํธ์บก์ณ๋ง ๋ฐ ๊ด๋ จ ์ ์ฉํ ํจ์๋ค
์ด๋ฒคํธ๊ฐ DOMํธ๋ฆฌ๋ฅผ ํ๊ณ ๋ฐ์ํ๋ ํ๋ฆ ์ด๋ฒคํธ๋ document์์ ์์ํด DOM ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ event.target๊น์ง ๋ด๋ ค๊ฐ๋ค. ์ด๋ฒคํธ๋ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉด์ addEventListener(..., true)๋ก ํ ๋นํ ํธ๋ค๋ฌ๋ฅผ ๋์์ํต๋๋ค. addEventListener(..., true)์ true๋ {capture: true}์ ์ถ์ฝํ์ด๋ค. ์ดํ ํ๊น ์์์ ์ค์ ๋ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋ค. ์ดํ์ ์ด๋ฒคํธ๊ฐ event.target๋ถํฐ ์์ํด์ ๋ค์ ์ต์์ ๋ ธ๋๊น์ง ์ ๋ฌ๋๋ฉด์ ๊ฐ ์์์ on๋ก ํ ๋นํ ํธ๋ค๋ฌ์ addEventListener๋ก ํ ๋นํ ํธ๋ค๋ฌ๋ฅผ ๋์์ํจ๋ค. addEventListener๋ก ํ ๋นํ ํธ๋ค๋ฌ ์ค, ์ธ ๋ฒ์งธ ์ธ์๊ฐ ์๊ฑฐ๋ false, {capture: false}์ธ ํธ๋ค๋ฌ๋ง ํธ์ถ๋..
[์ฝ๋ฉ์ ํ] ์์์ ๋์ด์ ์์น๊ฐ ๊ตฌํ๊ธฐ (clientHeight, offsetHeight, scrollHeight, getBoundingClientRect())
clientHeight console.log(element.clientHeight); clientHeight๋ ํจ๋ฉ์ ํฌํจํ ์์์ ๋์ด๋ฅผ ๊ฐ์ ธ์จ๋ค. offsetHeight console.log(element.offsetHeight); clientHeight๋ ํจ๋ฉ, ํ ๋๋ฆฌ, ๊ฐ๋ก์คํฌ๋กค๋ฐ(์๋ ๊ฒฝ์ฐ)์ ํฌํจํ ์์์ ๋์ด๋ฅผ ๊ฐ์ ธ์จ๋ค. scrollHeight console.log(element.scrollHeight); scrollHeight๋ ํจ๋ฉ, overflow๋ก ์ธํด ํ๋ฉด์ ํ์๋์ง ์์ ์ปจํ ์ธ ์ ํฌํจํ ์์์ ๋์ด๋ฅผ ๊ฐ์ ธ์จ๋ค. getBoundingClientRect() console.log(element.getBoundingClientRect()); // ์ถ๋ ฅ๊ฒฐ๊ณผ { top: 134 y: 134 ..
[์ฝ๋ฉ์ ํ] ์คํฌ๋กค ์ด๋ฒคํธ
์คํฌ๋กค๋ฐ ์์น ์ฐพ๊ธฐ : window.scrollY, window.scrollTop() window.addEventListener('scroll', function(){ console.log(window.scrollY); //window.pageYOffset๊ณผ ๋์ผํ ๊ธฐ๋ฅ(์ด์ชฝ์ด ํธํ์ฑ์ด ๋ ๋จ์ด์ง) }) //jquery๋ฒ์ $(window).on('scroll', function(){ $(window).scrollTop() //(100) ๊ดํธ์์ ์ซ์๋ฅผ ๋ฃ์ผ๋ฉด ํ์ฌ์คํฌ๋กค๋ฐ ์ด๋ }); ๋ ์์๊ฐ๊ธฐ : scrollTop์ ํ์ฌ ์คํฌ๋กค๋ฐ ์ด๋ ๊ธฐ๋ฅ๋ ๊ฒธํ๋ค. ๊ฐ์ ๋ก ๋งจ ์์์๋ถํฐ ์คํฌ๋กคํ๊ธฐ : scrollTo(x,y) window.addEventListener('scroll', function(){ wind..
[๋๋ฆผ์ฝ๋ฉ] ์ฝ๋ฐฑํจ์ (4) : ์ฝ๋ฐฑ์ง์ฅ ํ์ถ, Promise (callback hell ์ฝ๋๊ฐ์ ํ๊ธฐ)
Callback Hell ์์ ์ด์ ์๊ฐ์ ๋ง๋ค์๋ ์ฝ๋ฐฑ์ง์ฅ ์์๋ค. // ๊ธฐ๋ณธ์ธํ class UserStorage { loginUser(id, password, onSuccess, onError) { setTimeout(() => { if ( (id === 'master' && password === 'master00') || (id === 'submaster' && password === 'submaster00') ) { onSuccess(id); } else { onError(new Error('not found')); } }, 2000); } getRoles(user, onSuccess, onError) { setTimeout(() => { if (user === 'master') { onSucce..
[๋๋ฆผ์ฝ๋ฉ] ์ฝ๋ฐฑํจ์ (3) : promise๋ก Error Handlingํ๊ธฐ (reject, catch ํ์ฉ)
Error Handling const turnonLaptop = () => new Promise((resolve, reject) => { setTimeout(() => resolve(`๋ ธํธ๋ถ ์คํ.`), 1000); }); const loginBlog = blog => new Promise((resolve, reject) => { setTimeout(() => reject(new Error(`Error! ${blog} => ๋ธ๋ก๊ทธ ์ง์ .`)), 1000); }); const writePost = post => new Promise ((resolve, reject) => { setTimeout(() => resolve(`${post} => ๊ฒ์ ์๋ฃ.`), 1000); }); producer ์ฝ๋๋ฅผ ์์ฑํ..
[๋๋ฆผ์ฝ๋ฉ] ์ฝ๋ฐฑํจ์ (2) : ์ฝ๋ฐฑ์ง์ฅ ํ์ถ, Promise (State, Producing)
Promise Promise๋ javascript์ ๋ด์ฅ๋์ด์๋ object๋ก, ์ด๋ฅผ ํตํด์ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์์ฑํ ์ ์๋ค. ๋คํธ์ํฌํต์ ์ ํ๋ค๋์ง, ํ์ผ์ ์ฝ์ด์จ๋ค๋์ง ํ๋ ๋ฑ์ ๋ฌด๊ฑฐ์ด ์์ ์ ํ ๋๋ ์ค๋ ๊ฑธ๋ฆฌ๋ฏ๋ก Promise๋ก ์ฒ๋ฆฌํ๋ค. ๋ฌด๊ฑฐ์ด ์์ ์ ์ฒ๋ฆฌํ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ์์ฒญํ์ง ์์๋๋ฐ๋ ์ผ์ด๋๋ ๋ถํ์ํ ๋คํธ์ํฌํต์ (promiseํจ์์ ์คํ)์ ๋ฐฉ์งํด์ผ ํ๋ค. new Promise๊ฐ ๋ง๋ค์ด์ง๋ ์๊ฐ, ํด๋น executor ํจ์๊ฐ ์๋์ผ๋ก ์คํ๋๋ฏ๋ก ์ฃผ์ํ์. promise๋ ์๋ ๋ ๊ฐ์ง๋ฅผ ์ผ๋์ ๋๋ฉด ์ข๋ค. 1. State(์ํ) process๊ฐ ๋ฌด๊ฑฐ์ด operation์ ์ํํ๊ณ ์๋์ง/์๋ฃ๋์๋ค๋ฉด ์ฑ๊ณตํ๋์ง/์คํจํ๋์ง์ ์ํ pending : operation์ ์ํ ์ค์ธ ์ํ ..