focus, blur?
//์์ ์ฝ๋
<style>
.invalid { border-color: red; }
#error { color: red }
</style>
์ด๋ฉ์ผ: <input type="email" id="input">
<div id="error"></div>
<script>
input.onblur = function() {
if (!input.value.includes('@')) { // @ ์ ๋ฌด๋ฅผ ์ด์ฉํด ์ ํจํ ์ด๋ฉ์ผ ์ฃผ์๊ฐ ์๋์ง ์ฒดํฌ
input.classList.add('invalid');
error.innerHTML = '์ฌ๋ฐ๋ฅธ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์
๋ ฅํ์ธ์.'
}
};
input.onfocus = function() {
if (this.classList.contains('invalid')) {
// ์ฌ์ฉ์๊ฐ ์๋ก์ด ๊ฐ์ ์
๋ ฅํ๋ ค๊ณ ํ๋ฏ๋ก ์๋ฌ ๋ฉ์์ง๋ฅผ ์ง์
this.classList.remove('invalid');
error.innerHTML = "";
}
};
</script>
focus ์ด๋ฒคํธ๋ ์์๊ฐ ํฌ์ปค์ค๋ฅผ ๋ฐ์ ๋, blur ์ด๋ฒคํธ๋ ํฌ์ปค์ค๋ฅผ ์์ ๋ ๋ฐ์
- blur ํธ๋ค๋ฌ์์ ํ๋์ ์ด๋ฉ์ผ์ด ์ ์ ๋ ฅ๋์๋์ง ํ์ธํ๊ณ , ์ ์ ๋ ฅ๋์ง ์์ ๊ฒฝ์ฐ์ ์๋ฌ๋ฅผ ๋ณด์ฌ์ค
- focus ํธ๋ค๋ฌ์์๋ ์๋ฌ ๋ฉ์ธ์ง๋ฅผ ์จ๊น
- focus์ blur ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง ๋์ง ์์.
- ์บก์ฒ๋ง์ด๋ focusin ,focusout ์ ์ฌ์ฉํ๋ฉด ์ด๋ฒคํธ ์์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์
- ํ์ฌ ํฌ์ปค์ค๋ ์์๋ document.activeElement๋ฅผ ํตํด ํ์ธํ ์ ์์
focus ๊ฐ๋ฅํ HTML์์
๋ํํ ์์
- a
- button
- details
- input
- select
- textarea
์ด์ธ์ ์์๋ ๋น๋ํํ ์์๋ก ์นญํจ.
๐ก ๋น๋ํํ ์์์๋ ๊ฐ์ ๋ก tabindex๋ฅผ ์ฌ์ฉํด ํฌ์ปค์ฑ์ ์ค ์ ์์
tabindex - ํฌ์ปค์ฑ ๊ธฐ๋ฅ ๋ถ์ฌ
- tabindex=’์ซ์๊ฐ’ ํํ๋ก ์ฌ์ฉ
- ์ซ์๊ฐ์ด ์์๊ฐ→ํฐ๊ฐ์ ์์๋ก HTML ์์๊ฐ ํฌ์ปค์ฑ
- ์ซ์๊ฐ์ผ๋ก ์์๋ฅผ ์ค ์๋ ์๋๋ฐ, (๋ณดํต-`) ์์๋ฅผ ์ฃผ๊ฒ ๋๋ฉด ํค์ ๋ ฅ์ผ๋ก ํฌ์ปค์ฑ์ ์๋จ
- ๋ง์ฐ์ค ํด๋ฆญ์ด๋ focus() ๋ฉ์๋๋ก๋ ํฌ์ปค์ฑ์ด ๊ฐ๋ฅ
- tabindex๋ ์ฌ์ฉ์ ์ ๊ทผ์ฑ๊ณผ ๊ด๋ จ์๋ ๋ถ๋ถ์ด๋ฏ๋ก ๋จ์ฉํ์ง๋ง๊ณ ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ
<div tabindex='1'>A</div>
<div tabindex='3'>B</div>
<div tabindex='2'>C</div>
//Tabํค ์
๋ ฅ ์ A -> C -> B ์์ผ๋ก div ํํฌ๊ฐ ํฌ์ปค์ฑ
relatedTarget
- onblur ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ธ์๋ก ๋ฐ๋ event ๊ฐ์ฒด ์์ relatedTarget์ด ๊ฐ์ด ๋ด๊น.
- relatedTarget์ ์ด๋ฒคํธ์ ๋ณด์กฐ ๋์์ ์๋ณ
<input name='id' onblur='onblur()'/>
<input name='pw'/>
<script>
function onblur(e){
console.log(e.currentTarget); // A
console.log(e.relatedTarget); // B
}
</script>
- id input์ ํด๋ฆญํ ํ pw ํด๋ฆญ => A์๋ id input์ด ๋ด๊ฒจ์๊ณ , B์๋ pw input์ด ๋ด๊น
- ๊ทธ๋ฌ๋, id input์ด ํด๋ฆญ๋ ์ํ์์ pw input์ด ์๋ ๋น๊ณต๊ฐ ์๋ฌด๊ณณ์ ํด๋ฆญํ๊ฒ ๋๋ฉด null์ด ์ถ๋ ฅ.
- ํฌ์ปค์ฑ๋ ์ํ์ธ ์ด๋ค html ์์๊ฐ ์ฌ์ฉ์์ ๋ง์ฐ์ค ํด๋ฆญ ๋ฑ์ ์ํด ํฌ์ปค์ฑ ํด์ ๋ ๋
- ๋ค์์ผ๋ก ํฌ์ปค์ฑ ๋ html ์์๊ฐ related target์ ๋ด๊ฒจ์ง
React์์ focus, blur ํ๋ ๋ฒ
- react์์๋ onFocus, onBlur ๋ ๊ฐ์ง๋ง ์๋ค. ๋ฐ๋ผ์ ํฌ์ปค์ค๊ฐ ๋ ๋จ์ ํํํ๊ณ ์ ํ ๋๋ onBlur๋ฅผ ์ฌ์ฉ
- onBlur๋ฅผ ์ฌ์ฉํ ๋๋ tabIndex์์ฑ์ ๊ฐ์ด ์ฌ์ฉํด์ค์ผ onBlur์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ
- ๋จ, onBlur ์ด๋ฒคํธ๋ onClick ์ด๋ฒคํธ์ ๊ฐ์ด ์ฌ์ฉํ๊ฒ ๋ ์ ์์๊ฐ ๊ผฌ์ผ ์ ์์
- onMouseDown์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ํด๊ฒฐ ๋จ
- onMouseDown→onBlur→onClick
Reference
Element: blur event - Web APIs | MDN
์๋ฐ์คํฌ๋ฆฝํธ onfocus ์ onblur ๊ทธ๋ฆฌ๊ณ relatedTarget
๋ด์ธ๋ถ ๊ตฌ๋ถ, onBlur on react
React(๋ฆฌ์กํธ): input ์ํ ๊ด๋ฆฌํ๊ธฐ, input ์ฌ๋ฌ ๊ฐ
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] async / await 1 (1) | 2023.01.25 |
---|---|
[JavaScript] Event-onChange (0) | 2023.01.22 |
[JavaScript] ๋น๋๊ธฐ (0) | 2023.01.17 |
[JavaScript] API (0) | 2023.01.16 |
[JavaScript] AJAX & JSON (0) | 2023.01.15 |
๋๊ธ