[Javascript] focus, blur event
10111 단어 ReactwebJavaScriptEventEvent
focuse & blur
- 기본으로 제공하는
<button>, <input>, <select>, <a> 에는 foucus라는 기능이 존재한다. 일단적으로 focus 란 해당 요요소에 데이터를 입력할 준비가 되었다를 의미한다.
blur는 포커스를 잃은 순간을 이야기하는데 요소가 포커스를 잃게되면서 데이터를 체크해 요청을 보내는 활동을 하기 때문에 중요하다.
focus : 요소가 포커스 받을때
blur : 요소가 포커스를 잃었을 때
tabindex
- 위 처럼 focus는 모든 요소가 가지고 있는 특징이 아니다. 그래서 아이콘이나 여타 다른 요소에 focus와 blur를 주기위해서는
tabindex속성을 활용한다.
tabindex가 있는 속성은 아무런 상관없이 포커스가 가능하다. 숫자를 통해 요소별 포커스의 순서를 나타내줄수 있다. (작은 수 -> 큰 수 : 기본순서)
<ul>
<li tabindex="1">일</li>
<li tabindex="0">영</li>
<li tabindex="2">이</li>
<li tabindex="-1">음수 일</li>
</ul>
실제적용 코드
- 로그아웃 버튼을 누르면 진짜 로그아웃을 할 것인지 확인하는 dropdown이 발생하는데 안에 포함된 "아니요" 말고도 이외의 영역을 눌러도 dropdown이 닫히는 기능을 구현하는데 사용했다.
<FontAwesomeIcon tabIndex={0} icon={faSignOutAlt}
onFocus={this.clickLogout}
onBlur={this.closeLogoutDropDown} />
{this.openLogout && this.renderLogoutDropDown()}
- 아이콘을 클릭하면 focus가 잡히면서 this.clickLogout 함수가 실행이 되고, focus를 잃는순간 blur가 실행되면서 this.closeLogoutDropDown 함수가 실행이 된다.
private renderLogoutDropDown = () => {
return <article className={"logout-dropdown"} onMouseDown={e=>e.preventDefault()}>
<p>로그아웃을 하시겠습니까?</p>
<button onMouseDown={e => e.preventDefault()}
onClick={this.confirmLogout}>네
</button>
<button onMouseDown={e => e.preventDefault()}
onClick={this.closeLogoutDropDown}>아니요
</button>
</article>
}
- 여기서 preventDefault()를 사용해서 원하는 영역의 focus이벤트를 끊어줄 수 있다. 이후 Click이벤트에 해당하는 함수를 실행하며 dropdown 로직을 실행하다.
- 여기서 중요한 점은 아이콘을 누른뒤 dropdown 외의 지역을 누르면 blur가 잘 작동되는걸 볼 수 있다. 아이콘 입장에서 preventDefaul가 적용된 영역을 누르면 foucs를 빼앗기지 않았다. 그래서 focus는 여전히 아이콘에 머물러 있다. 하지만 그 외의 영역을 누르면 focus를 잃어버리기 때문에 그제서야 blur 함수가 작동한다.
<button>, <input>, <select>, <a> 에는 foucus라는 기능이 존재한다. 일단적으로 focus 란 해당 요요소에 데이터를 입력할 준비가 되었다를 의미한다. blur는 포커스를 잃은 순간을 이야기하는데 요소가 포커스를 잃게되면서 데이터를 체크해 요청을 보내는 활동을 하기 때문에 중요하다.focus : 요소가 포커스 받을때
blur : 요소가 포커스를 잃었을 때
- 위 처럼 focus는 모든 요소가 가지고 있는 특징이 아니다. 그래서 아이콘이나 여타 다른 요소에 focus와 blur를 주기위해서는
tabindex속성을 활용한다. tabindex가 있는 속성은 아무런 상관없이 포커스가 가능하다. 숫자를 통해 요소별 포커스의 순서를 나타내줄수 있다. (작은 수 -> 큰 수 : 기본순서)
<ul>
<li tabindex="1">일</li>
<li tabindex="0">영</li>
<li tabindex="2">이</li>
<li tabindex="-1">음수 일</li>
</ul>
실제적용 코드
- 로그아웃 버튼을 누르면 진짜 로그아웃을 할 것인지 확인하는 dropdown이 발생하는데 안에 포함된 "아니요" 말고도 이외의 영역을 눌러도 dropdown이 닫히는 기능을 구현하는데 사용했다.
<FontAwesomeIcon tabIndex={0} icon={faSignOutAlt}
onFocus={this.clickLogout}
onBlur={this.closeLogoutDropDown} />
{this.openLogout && this.renderLogoutDropDown()}
- 아이콘을 클릭하면 focus가 잡히면서 this.clickLogout 함수가 실행이 되고, focus를 잃는순간 blur가 실행되면서 this.closeLogoutDropDown 함수가 실행이 된다.
private renderLogoutDropDown = () => {
return <article className={"logout-dropdown"} onMouseDown={e=>e.preventDefault()}>
<p>로그아웃을 하시겠습니까?</p>
<button onMouseDown={e => e.preventDefault()}
onClick={this.confirmLogout}>네
</button>
<button onMouseDown={e => e.preventDefault()}
onClick={this.closeLogoutDropDown}>아니요
</button>
</article>
}
- 여기서 preventDefault()를 사용해서 원하는 영역의 focus이벤트를 끊어줄 수 있다. 이후 Click이벤트에 해당하는 함수를 실행하며 dropdown 로직을 실행하다.
- 여기서 중요한 점은 아이콘을 누른뒤 dropdown 외의 지역을 누르면 blur가 잘 작동되는걸 볼 수 있다. 아이콘 입장에서 preventDefaul가 적용된 영역을 누르면 foucs를 빼앗기지 않았다. 그래서 focus는 여전히 아이콘에 머물러 있다. 하지만 그 외의 영역을 누르면 focus를 잃어버리기 때문에 그제서야 blur 함수가 작동한다.
<FontAwesomeIcon tabIndex={0} icon={faSignOutAlt}
onFocus={this.clickLogout}
onBlur={this.closeLogoutDropDown} />
{this.openLogout && this.renderLogoutDropDown()}
private renderLogoutDropDown = () => {
return <article className={"logout-dropdown"} onMouseDown={e=>e.preventDefault()}>
<p>로그아웃을 하시겠습니까?</p>
<button onMouseDown={e => e.preventDefault()}
onClick={this.confirmLogout}>네
</button>
<button onMouseDown={e => e.preventDefault()}
onClick={this.closeLogoutDropDown}>아니요
</button>
</article>
}
+참고
https://ko.javascript.info/focus-blur
Author And Source
이 문제에 관하여([Javascript] focus, blur event), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@wjd489898/Web-focus-blur-event저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)