๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Language/JavaScript

[JavaScript] Event-onFocus, onBlur

by DevIseo 2023. 1. 20.

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

focus์™€ blur

๋‚ด์™ธ๋ถ€ ๊ตฌ๋ถ„, onBlur on react

React.js - focus, blur ์˜ˆ์ œ

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

๋Œ“๊ธ€