ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ค์๊ณผ ๊ฐ์ด Input ํ๊ทธ์ ํค์๋๋ฅผ ์ ๋ ฅํ๋ฉด ๊ด๋ จ ํค์๋์ ๋ํด์ ์ถ์ฒ ๊ฒ์์ด๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ฃผ๋๋ก ๊ตฌํํ๊ณ ์ ํ๋ค.
debounce๋ฅผ ํตํ request ํธ์ถ ์ต์ํ
์ฌ์ฉ์ Input ํ๊ทธ์ ํค์๋๋ฅผ ์ ๋ ฅํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ถ์ฒ ๊ฒ์ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก, debounce ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์๋์ ์ผ๋ก ์ง์ ๋ ์๊ฐ๋งํผ ๋๋ ์ดํ์๋ค.
let dispatchEvent = debounce(
(targetText) => { //์ฌ์ฉ์๊ฐ Input ํ๊ทธ์ ์
๋ ฅํ value ๊ฐ
requestAdapter.get(this.requestUrl, targetText)
.then((result) => {
this.displayWordList(
this.searchListElement,
result
);
})
}
,this.DEFAULT_DELAY_TIME);
์ด๋ debounce ํจ์์์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ ์ฝ๋ฐฑํจ์๋ targetText ๋ผ๋ ์ฌ์ฉ์๊ฐ ํ์ฌ Input ํ๊ทธ์ ๋จ๊ธด ํค์๋๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ์๋ค.
targetText๋ ๋ค์๊ณผ ๊ฐ์ด ํจ์๋ฅผ ๋ฆฌํด ๋ฐ์ dispatchEvent ๋ด์์ argument๋ก ์ฒ๋ฆฌํ์ฌ ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌํ๋ค.
(์ฒจ์ธํ์๋ฉด ์์ ํจ์์ ๋งค๊ฐ๋ณ์์ธ callback๊ณผ delayTime์ ํด๋ก์ ์ ์ํด ์ค์ฒฉ_์์ ํจ์ ๋ด์์ ์ฐธ์กฐํ ์ ์๋ค)
export const debounce = (callback, delayTime) => {
let timeout = null;
return (...args) => {
const context = this;
if(timeout) clearTimeout(timeout);
timeout = setTimeout(() => callback.apply(context, args), delayTime);
}
}
์ด๋ ์ ๋ฌ ๋ฐ์ argument๋ Rest ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ๋ฐ์์ผ๋ก์จ ๋ฐฐ์ด์ ํํ๋ฅผ ๋๊ฒ ๋๋๋ฐ, ์ด ๋ฐฐ์ด ๋ด์ ์ธ์๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ํด์
func.call()์ด ์๋ func.apply()๋ฅผ ์ฌ์ฉํ๋ค.
call() ๋ฉ์๋๋ ์ฃผ์ด์ง this ๊ฐ ๋ฐ ๊ฐ๊ฐ ์ ๋ฌ๋ ์ธ์์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
์ด ํจ์ ๊ตฌ๋ฌธ์ ์ธ์ ๋ชฉ๋ก์, ๋ฐ๋ฉด์ apply()๋ ์ธ์ ๋ฐฐ์ด์ ๋ฐ๋๋ค๋ ์ ์ด ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค.
์ ๋ฆฌํ์๋ฉด, Input ํ๊ทธ์์ ์ ๋ฌ ๋ฐ์ value๋ ๋ค์๊ณผ ๊ฐ์ ํธ์ถ ์์๋ก ์ ๋ฌ์ด ๋๋ค.
์ด๋ฒคํธ ๋ฐ์ => dispatchEvent(value) => debounce Callback(value) => setTimeout Callback(value) => request(value)
debounce์์์ ์ฝ๋ฐฑ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํด ๋ฐ๋๋ค.
export class RequestMockAdapter {
constructor() {}
get(url, param) {
return new Promise((resolve, reject) => {
resolve(
param ?
request.data.filter((item) => item.text.toLocaleLowerCase().indexOf(param.toLocaleLowerCase()) > -1) :
[]
);
})
}
}
์ ๋ ฅ๋ฐ์ ํค์๋๊ฐ ์์ ๊ฒฝ์ฐ(param๊ฐ) ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ด์์ ํด๋น ํค์๋๋ฅผ ํฌํจํ๊ณ ์๋ ๋จ์ด๋ค์ ์๋ก์ด ๋ฐฐ์ด์ ์ ์ฌํ์๋ค.
๋ง์ฝ์ K๋ฅผ Input์ ์ ๋ ฅ์ ํ๊ฒ ๋๋ค๋ฉด K๋ก ์์๋๋ ๋ชจ๋ ํค์๋๋ค์ ์ฐพ๊ณ , Ke๋ฅผ Input์ ์ ๋ ฅ์ ํ๊ฒ ๋๋ค๋ฉด Ke๋ก ์์๋๋
๋ชจ๋ ํค์๋๋ค์ ์ฐพ๋๋ค. ์ด๋ K๋ฅผ ๊ธฐ์ค์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋๋ฐ K ๋ค์์ ์ฐ์๋์ ์ค๋ ํค์๋๊ฐ ์์ ๊ฒฝ์ฐ์๋ K์ ์ธ๋ฑ์ค ์์
(์ต์ 0์ ๊ฐ์ ์ง๋)๋ฅผ ๋ฐํํ์ง๋ง ์ฐ์๋์ ์ค๋ ํค์๋๊ฐ ์์ ๊ฒฝ์ฐ์๋ -1์ ๋ฐํํ๋ค.
์ด๋ ํค์๋์ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถ ์ง์ง ์๊ธฐ ์ํด์ toLocaleLowerCase()๋ฅผ ์ฌ์ฉํ์ฌ ์ฐพ์์ผ ํ ํค์๋๋ฅผ ์๋ฌธ์๋ก ํต์ผํ์๋ค.
filter() ๋ฉ์๋์ ๋ํ ๊ฒฐ๊ณผ๊ฐ์ ์๋ก์ด ๋ฐฐ์ด์ ํ ๋น๋๋๋ฐ, ์ด๋ resolve()๊ฐ ํธ์ถ๋๋ฉด์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋์ธ then()์ ์ธ์์ธ result์
ํ ๋นํ์๋ค.
requestAdapter.get(this.requestUrl, targetText)
.then((result) => {
this.displayWordList(
this.searchListElement,
result
);
})
focusEvent
๋ง์ฐ์ค๊ฐ Input ์ฐฝ์์ ํฌ์ปค์ค ์์์ด ๋๋ฉด ์ถ์ฒ ํค์๋ ๋ฆฌ์คํธ ์ฐฝ์ ํ๋ฉด์์ ์ฌ๋ผ์ง๋๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ๋ค์๊ณผ ๊ฐ์ด ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ด์ฉํ์๋ค.
document.querySelector('body').addEventListener('click', e => {
if(!e.target.classList.contains(`${this.textinputElement.getAttribute('class')}`)) {
this.searchListElement.style.display = 'none';
}
})
ํ์ง๋ง ์ด๋ณด๋ค๋ ๋ช ์์ ์ผ๋ก ์์์์ ํฌ์ปค์ค๊ฐ ๋จ์ด์ก์ ๋๋ฅผ ๊ฐ์งํ๋ ์ด๋ฒคํธ์ธ focusout/focusin ์ด ์๋ค๋ ๊ฒ์ ํ์ธํ์๊ณ ์ด๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฉํ์๋ค.
focusout ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์์๋ ์๊ฒ ์ด์ ์ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ค.
๋ฐ๋ฉด์ focusin ์ด๋ฒคํธ๋ ์์๊ฐ ํฌ์ปค์ค๋ฅผ ๋ฐ์๋ ค๊ณ ํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ค.
this.textinputElement.addEventListener('focusout', () => {
if(listOver) return;
this.hiddenElem(this.searchListElement); //๋ฆฌ์คํธ๋ฅผ ์จ๊ธฐ๋ ํจ์๋ฅผ ํธ์ถ
})
this.textinputElement.addEventListener('focusin', e => {
dispatchEvent(e.target.value); //Input ํ๊ทธ์ ์๋ ํค์๋์ ๋ฐ๋ฅธ ์ถ์ฒ ๊ฒ์ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ํธ์ถ
})
mouseEvent
๋ฆฌ์คํธ์ ๋ง์ฐ์ค๊ฐ hover๊ฐ ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ํฌ์ปค์ค๋ฅผ ์๋๋ผ๋ ๋ฆฌ์คํธ๊ฐ ํ๋ฉด ์์์ ์ฌ๋ผ์ง๋ฉด ์๋๊ธฐ ๋๋ฌธ์ mouseover/mouseout ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์๋ค.
this.searchListElement.addEventListener('mouseover', () => {
listOver = true; //listOver๊ฐ ์ฐธ์ผ ๊ฒฝ์ฐ์๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ๋ผ์ง์ง ์๊ฒ return
})
this.searchListElement.addEventListener('mouseout', () => {
listOver = false;
})
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
RxJS debounceTime operator๋ฅผ ํตํด Event request ์ค์ด๊ธฐ (0) | 2021.07.17 |
---|---|
textContent์ ๊ณต๋ฐฑ ๋ฌธ์ (0) | 2021.07.16 |
getBoundingClientRect_์์ ์์น ์ก๊ธฐ (0) | 2021.07.14 |
insertAdjacentElement๋ก ์์ ์ถ๊ฐ (0) | 2021.07.13 |
์บ๋ฌ์ (Carousel) (0) | 2021.07.10 |