본문 바로가기
dev/javascript

[javascript] 자바스크립트 온라인/오프라인 확인 (navigator.onLine)

by 최연탄 2023. 6. 1.
728x90
반응형

참고: https://dev.to/nialljoemaher/detecting-if-a-user-is-online-offline-with-javascript-3bcc

매일 인터넷이 빵빵한 사무실에서 일하는 개발자로서 인터넷이 되는 것은 당연한 일이고 localhost는 가장 빠른 사이트가 됩니다. 하지만 많은 사람들이 간과하고 있는 것이 무엇이냐면 모든 인터넷 환경이 일관적으로 좋지는 않다는 것 입니다.

이 포스트에서는 사용자가 인터넷에 연결되어 있는지 확인하고 연결이 끊어지거나 다시 연력되는 것을 감지하여 인터넷 상태에 따라 적절히 UI를 업데이트 하는 방법을 알아보겠습니다.

기본 코드

index.html:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <link rel="stylesheet" href="style.css" />
</head>

<body>
  <div class="app">
    <h1 class="status">Hello</h1>
  </div>
  <script src="app.js"></script>
</body>

</html>

style.css:

body {
  background-color: #555;
}

.app {
  height: 100vh;
  width: 100vw;
  display: flex;
  justify-content: center;
  align-items: center;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
    Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
}

.status {
  padding: 40px;
  min-width: 120px;
  border-radius: 20px;
  background-color: #eee;
  text-align: center;
  font-size: 80px;
}

.status.online {
  border: 8px solid #41a700;
  color: #41a700;
}

.status.offline {
  border: 8px solid #f15c4f;
  color: #f15c4f;
}

빈 app.js 파일까지 추가하면 준비는 끝입니다.

현재 폴더 구조는 다음과 같아야합니다:

├── app
│   ├── index.html
│   └── style.css
│   └── app.js

이제 app.js 파일을 열어 사용자가 인터넷에 연결되어 있는지 여부에 따라 DOM을 조작하는 함수를 만들어 보겠습니다. 함수가 받는 매개변수는 불린 값 입니다.

function hasNetwork(online) {
  const element = document.querySelector(".status");

  if (online) {
    element.classList.remove("offline");
    element.classList.add("online");
    element.innerText = "Online";
  } else {
    element.classList.remove("online");
    element.classList.add("offline");
    element.innerText = "Offline";
  }
}

위의 코드에서 매개변수로 받은 online 값이 true 면 요소에 online을 설정하고 false 면 offline을 설정합니다.

이제 다음 부분을 보겠습니다. 먼저 navigator.onLine을 사용하여 페이지가 처음 로드될 때 인터넷이 연결되어 있는지 확인합니다. navigator.onLine은 불린 값을 반환합니다.

window.addEventListener("load", () => {
  hasNetwork(navigator.onLine);
});

브라우저가 이 기능을 지원하는지 확인하는 작업은 매우 중요합니다. 이에 관련된 자세한 내용은 MDN docs를 참고하기 바랍니다.

Chrome 이나 Safari의 경우 브라우저가 LAN 이나 라우터에 연결할 수 없으면 offline 상태로 false를 리턴하고 이외의 모든 상태는 true를 리턴합니다. 여기서 브라우저가 false를 리턴하면 offline인 것을 확신할 수 있지만 true를 리턴한다고 반드시 인터넷에 엑세스할 수 있음을 의미하지는 않습니다. (목적지 서버가 불통인 경우)

설명

위의 코드는 처음에는 무의미한 단계처럼 보일 수 있습니다. 하지만 현재 네트워크 상태를 알고있으면 사용자가 캐시된 웹 페이지를 오프라인에서 보고있는 경우를 식별할 수 있기 때문에 필요합니다. 이를 이용해 페이지가 로드되면 콘텐츠가 최신 버전이 아닐 수 있다는 것을 사용자에게 알릴 수 있습니다.

다음으로 할 일은 사용자의 네트워크 상태가 변경될 때를 알 수 있도록 online 및 offline에 대한 이벤트 리스너를 추가하는 것 입니다. 여기서 관심을 가져야 할 것은 online과 offline 이벤트 입니다. 이름에서 짐작할 수 있듯이 이 이벤트는 사용자의 네트워크가 온라인과 오프라인 사이에 전활될 때 트리거됩니다.

window.addEventListener("load", () => {
  hasNetwork(navigator.onLine);

  window.addEventListener("online", () => {
    hasNetwork(true);
  });

  window.addEventListener("offline", () => {
    hasNetwork(false);
  });
});

이제 사용자의 네트워크 상태가 변경될 때 실시간 피드백을 받게 됩니다.

이걸 언제 쓸까요?

파일 업로드 시 사용자에게 오프라인이기 때문에 업로드 할 수 없다고 알려야 할 때도 있고, 실시간 데이터를 제공하는 경우 사용자가 오프라인이면 최신 데이터가 아님을 알려야합니다. 이 외에도 네트워크 상태를 감지해야 하는 수십가지 이유가 있으며 사용자 친화적인 UX를 만들기 위해 노력해야 합니다.

관련 글

자바스크립트 이벤트 핸들러 등록 (addEventListener)

반응형

댓글