click
이 아닌 pointerdown
으로 변경, e.preventdefault
선언하면 된다.pointerdown
or mousedown
으로 변경하는 이유는 전체 'click' event가 중단도click
대신 pointerdown
이나 mousedown
으로 변경 후e.preventDefault()
하면 왜 focusout이 안될까?e.preventDefault()
click
과 pointerdown
or mousedown
의 차이click
이벤트는 마우스의 왼쪽 클릭만을 인식한다. 또한 요소가 눌렸다가 떨어지는 순간 발생한다.pointerdown
이벤트는 마우스, 펜, touch에 의해서도 발생하며 마우스의 경우 왼쪽, 가운데, 오른쪽 클릭 전부를 인식한다. 요소가 눌리는 순간 발생한다.click
: preventDefault
상태에서 focus가 input에서 넘어간다. pointerdwon
: preventDefault
상태에서 focus가 넘어가지 않는다.마우스 눌림 -> pointerdown 이벤트 -> focusout -> focusin -> 마우스가 올라감 -> click 이벤트
click
이벤트는 focusout과 focusin이 발생한 뒤 발생함으로 차단을 할 수 없다.아래의 코드의 실행 순서
let num = 1; //a번
setTimeout(() => {
num = 2; //b번
}, 0);
num = 3; //c번
console.log(num);
특정 함수의 실행을 원하는 시간만큼 미루기 위해 사용된다. 첫번째 파라미터에 있는 콜백의 실행을 두번째 파라미터에 적힌 숫자 ms 뒤로 미룬다.
타이머 식별자를 반환합니다. 하지만 타이머 사용 시, 정확한 지연 시간을 보장해주지는 않는다!
코드에서는 지연 시간을 0으로 뒀는데, 기대한대로 동작하지는 않았다.
🙋 내가 기대한 것은 지연시간이 0이기 때문에 c번보다 먼저 실행되는 것을 기대했다.
이때 고려해야할 점은 브라우저에서 JavaScript 코드가 실행되는 과정을 알아야한다.
먼저! 자바스크립트는 싱글스레드 언어이다.
하나의 싱글 콜 스택만을 가지고 있다는 뜻이며, 자바스크립트의 엔진은 한 번에 하나의 태스크만 실행할 수 있다는 뜻이다.
호출 스택에 저장되는 각 항목을 실행 맥락(execution context)이라고 부릅니다. 실행 맥락에는 아래와 같은 정보들이 저장된다.
this
가 가리키는 객체브라우저가 JavaScript 코드를 실행시킬 때, 호출 스택을 다음과 같이 조작한다.
웹 브라우저는 호출 스택에 실행 맥락이 존재하는 동안, 즉 실행 중인 함수가 존재하는 동안에는 먹통이 되어 버린다
브라우저에서는 다음과 같은 절차를 통해 오래 기다려야 하는 일을 처리할 수 있다.
JavaScript 코드를 작성할 때에는, 호출 스택과 작업 큐의 성질을 반드시 염두에 두어야 한다.
지연시간을 0으로 주면, 브라우저는 setTimeout
에 넘겨진 콜백을 바로 실행하는 것이 아니라 그 콜백을 작업 큐에 등록한다. 호출 스택이 비워지면, 그제서야 작업 큐에 들어있는 콜백을 가져와서 실행시킨다. 이 때문에 num = 2
가 나중에 실행되는 것이다.
let num = 1; //a번
setTimeout(() => {
num = 2; //b번, 작업 큐에 콜백이 추가됨
}, 0);
num = 3; //c번
console.log(num); //d번
따라서 실행 순서는, a번 → c번 → d번 → b번 순서이다.
그러니 출력되는 값은 3
이다. 하지만 이후 console.log(num)
을 해보면 num에 2가 할당되어있음을 알 수 있다.
const s = new Date().getSeconds();
setTimeout(function() {
// "2"를 출력, 즉 0.5초가 지난 후 즉시 실행된 것이 아니라는 것
console.log((new Date().getSeconds() - s) + "초 후 실행됨"); }, 500)
while (true) {
if (new Date().getSeconds() - s >= 2) {
console.log("좋아요, 2초간 반복했습니다.") break; }
}
Week3 미션의 signup 기능 구현 시,
- 이메일 input에서 focus out 일 때, 값이 유효하지 않으면 alert 경고문 생성
- 비밀번호 input에서 focus out일 때 값이 유효하지 않으면 alert 경고문이 생성되는 기능
을 구현하는 요구사항이 있다. 이때 focus를 이메일 input에 뒀다가 바로 비밀번호 input을 클릭할 경우
이메일 input focusout
→ 비밀번호 input focusin (add focusout eventlistener)
→ alert
와 동시에비밀번호 input focusout
→ alert
와 동시에 ..
이 과정이 무한 루프로 발생하는 이슈가 생겼다.
+추가적으로 Enter를 사용한 submit을 했을 때도 무한 루프가 발생!!ㅠㅠ
이를 해결하기 위해서 ChatGPT에게 alert로 인한 focusout과 디바이스의 click으로 인한 focusout의 차이를 알려달라했더니 그 결과,
하지만 sourceCapability
프로퍼티를 처음봤고.. 이를 사용하는 것은 일반적이지 않은 것같다는 결론이 나왔다. 아직 해결 못함..