Post

Beforeunload, visibilitychange 사용해서 사용자가 웹페이지를 떠날때 이벤트 잡기

사용자가 마지막까지 이 페이지에 얼마나 머물렀는지 알고 싶다면?


사용자가 어떤 페이지에서 떠날 때를 알고 싶을때 사용 할 수 있는것이 beforeunload 이벤트이다! 요게 나는 단순하게 뒤로가기나 다른 페이지를 눌렀을때만 발생하는줄 알았는데 이거 뿐만 아니라 브라우저를 종료했을때도 어김없이 요 이벤트가 호출이 된다!

코드를 살펴보자


이렇게 코드를 짜면 사용자가 어떤 페이지에서 얼마만큼 머물렀는지 알 수 있다!

1
2
3
4
5
6
7
8
9
const enterTime = Date.now();
window.addEventListener('beforeunload', () => {
    const leaveTime = Date.now();
    const duration = (leaveTime - enterTime)
    const xhr = new XMLHttpRequest();
    xhr.open("POST", "/save-stay-duration", false);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(JSON.stringify({ duration }));
});

하지만 이렇게 하면 간혹 엄청 큰 값이 들어올수가 있다!

탭을 바꾸는것 처럼 사이트를 나가지 않았는데 다른곳으로 간거는?


beforeunload 로는 사용자가 탭을 바꿔서 실제로는 다른 작업을 하고 있는것을 잡을 수 없다. 따라서 이럴때 사용할수 있는것이 visibilitychange 이벤트이다! 요 이벤트로는 사용자가 실제로 내 페이지를 보고 있있는지 아닌지를 알 수 있다! 따라서 두개를 합친다면 조금더 정확한 값을 구할 수 있다!

코드


visibility를 이용해서 진짜 있었던 시간을 싹 더해서 그 값만 beforeunload에 보내준다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let totalTime = 0; 
let lastEnterTime = Date.now();
document.addEventListener('visibilitychange', () => {
    if (document.visibilityState === 'hidden') { // 안볼때        
        const leaveTime = Date.now();
        totalTime += leaveTime - lastEnterTime;
    } else if (document.visibilityState === 'visible') { // 볼때
        lastEnterTime = Date.now();
    }
});
window.addEventListener('beforeunload', () => {
    const leaveTime = Date.now();
    totalTime += leaveTime - lastEnterTime;
    const xhr = new XMLHttpRequest();
    xhr.open("POST", "/save-stay-duration", false);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(JSON.stringify({ duration: totalTime }));
});
This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.