개발자

next.js 브라우저 뒤로가기 이벤트 막기

2022년 10월 07일조회 4,064

브라우저 백버튼을 눌렀을 때 뒤로가기 동작을 막고 모달을 띄우고 싶습니다. 모달에서 확인을 눌렀을 때 뒤로가게하고 취소를 하면 페이지에 머물게 만드려고 합니다. next.js에서 브라우저 백버튼 이벤트를 감지할 수 있는 방법이 있을까요???

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

성원님의 프로필 사진

next.js의 router object가 제공하는 beforePopState 함수를 통해 브라우저의 뒤로가기 이벤트를 제어할 수 있습니다. beforePopState 함수의 실행 흐름은 다음과 같습니다. 뒤로가기 버튼 클릭 → 브라우저 주소 변경 → router.beforePopState 실행 → router.beforePopState 함수가 false를 리턴하면 주소만 변경되고 실제로 화면을 이동하지 않음 beforePopState 함수를 이해하려면 브라우저가 어떻게 주소를 변경하고 페이지를 이동시키는지 이해해야 합니다. 간단하게 기술해보면 브라우저 백버튼 클릭 -> 브라우저 히스토리의 주소가 변경됨 (맨 위의 주소가 pop됨) -> popstate 이벤트가 실행되면서 페이지가 이동. beforePopState함수는 boolean 값으로 popstate 이벤트를 실행할지 결정할 수 있어서 실제 브라우저의 이동을 막을 수 있습니다. 여기서 한가지 중요한 것은 브라우저의 주소가 변경되는 것은 막을 수 없기 때문에 바뀐주소를 다시 원상태로 되돌려야 합니다. 그때는 보통 window.history.pushState 함수를 사용하여 브라우저 히스토리에 주소를 추가합니다 (pushState 함수는 popstate 이벤트를 발생시키지 않고 주소만 추가함) 말씀하신 기능 요구사항에 맞추어 코드를 작성하면 대략 다음과 같을 것 같네요! useEffect(() => { router.beforePopState(state => { window.history.pushState(null, '', router.asPath); OpenModal().then(({ isConfirmed }) => { if (isConfirmed) { router.beforePopState(() => true); router.back(); } }); return false; }); }, []);

profile picture

익명

작성자

2022년 10월 17일

와 자세한 설명 정말 감사합니다!! 해당 코드 적용해 보겠습니다ㅎㅎ

성원님의 프로필 사진

성원

Software Engineer2022년 11월 30일

아무래도 브라우저 히스토리를 직접 조작하면 타이밍 이슈와 같은 사이드 이펙트가 발생할 수 있습니다🙏 제 코드가 정답이라고 할 수 없어서 next.js에서의 history이벤트 조작, 브라우저 변경 이벤트가 어떻게 이루어지는 지를 중점으로 이해해 주시고 사용에 참고해주시면 감사하겠습니다!

커리어리 AI 봇님의 프로필 사진

네, next.js에서 브라우저 백버튼 이벤트를 감지하는 방법이 있습니다. 이를 위해 next.js는 Router를 제공합니다. Router를 사용하면 페이지 전환시에 브라우저 히스토리에 pushState() 메소드를 사용하여 URL을 추가하고, popstate 이벤트를 이용하여 브라우저 백버튼을 감지할 수 있습니다. 따라서, 모달을 띄웠을 때는 pushState() 메소드를 사용하여 URL을 추가하고, popstate 이벤트를 이용하여 브라우저 백버튼을 감지하면 됩니다. 아래는 예시 코드입니다. 이렇게 구현하면, 모달이 떠있는 동안에는 브라우저 백버튼을 눌러도 모달이 닫히지 않고, 모달에서 확인 버튼을 눌렀을 때에만 브라우저 백버튼이 동작하여 페이지가 이전 페이지로 이동합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { useEffect } from 'react';
import { useRouter } from 'next/router';

function Modal() {
  const router = useRouter();

  useEffect(() => {
    function handleRouteChange() {
      // 모달을 닫음
      closeModal();
    }

    // 페이지 전환시 발생하는 이벤트
    window.history.pushState(null, null, window.location.pathname);
    window.addEventListener('popstate', handleRouteChange);

    return () => {
      window.removeEventListener('popstate', handleRouteChange);
    };
  }, []);

  function closeModal() {
    // 모달을 닫고 페이지에 머무르게 함
    router.replace(router.asPath);
  }

  return (
    // 모달 컴포넌트
  );
}

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!