์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•

D
dongAuthor
2 min read

์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?
๋’ค๋กœ๊ฐ€๊ธฐ๋ผ๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋‹จ์ˆœํžˆ "ํŽ˜์ด์ง€ ์ด๋™"์œผ๋กœ๋งŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์—ฌ๋‹ค๋ณด๋ฉด, ์ด ์งง์€ ์ˆœ๊ฐ„์— ์ˆ˜๋งŽ์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑ ์ค‘์ด๋˜ ๊ธ€์ด ๋‚ ์•„๊ฐ€๊ฑฐ๋‚˜, ๊ฒฐ์ œ ๊ณผ์ •์ด ๋Š๊ธฐ๊ฑฐ๋‚˜, ์‹ฌ์ง€์–ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ์ˆ˜๋„ ์žˆ์–ด์š”. ๐Ÿ˜ฐ

์˜ค๋Š˜์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€

popstate ์ด๋ฒคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

๋ธŒ๋ผ์šฐ์ €๋Š” ์ฃผ์†Œ(URL) ๋ณ€๊ฒฝ์ด๋‚˜ ์„ธ์…˜ ํžˆ์Šคํ† ๋ฆฌ ๋ณ€ํ™”๊ฐ€ ์žˆ์„ ๋•Œ popstate ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ด ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋’ค๋กœ๊ฐ€๊ธฐ๋ฅผ ๋ˆŒ๋ €๋Š”์ง€ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

popstate ์ด๋ฒคํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ๊ธฐ๋ก ํƒ์ƒ‰์œผ๋กœ ์ธํ•ด ํ˜„์žฌ ํ™œ์„ฑํ™”๋œ ๊ธฐ๋ก ํ•ญ๋ชฉ์ด ๋ฐ”๋€” ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ™œ์„ฑํ™”๋œ ์—”ํŠธ๋ฆฌ๊ฐ€ history.pushState() ๋ฉ”์„œ๋“œ๋‚˜ history.replaceState() ๋ฉ”์„œ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋˜๋ฉด, popstate ์ด๋ฒคํŠธ์˜ state ์†์„ฑ์€ ํžˆ์Šคํ† ๋ฆฌ ์—”ํŠธ๋ฆฌ state ๊ฐ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์š” !

window.addEventListener("popstate", (event) => {
  console.log("๋’ค๋กœ๊ฐ€๊ธฐ ๋ฐœ์ƒ!", event);
});

๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค !

popstate ํ˜ธํ™˜์„ฑ ์Šคํฌ๋ฆฐ์ƒท

๋ธŒ๋ผ์šฐ์ €๋Š” popstate ์ด๋ฒคํŠธ๋ฅผ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์‹œ์— ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Chrome(v34 ์ด์ „๋ฒ„์ „) ์™€ Safari๋Š” popstate ์ด๋ฒคํŠธ๋ฅผ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์‹œ์— ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Firefox ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ alert์™€ ๊ฐ™์ด ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด? beforeunload ์ด๋ฒคํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ

ํ˜น์€ beforeunload๋กœ ์ฒ˜๋ฆฌํ•ด๋ณผ ์ˆ˜๋„ ์žˆ์–ด์š”. ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” window, ๋ฌธ์„œ(document) ๋ฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ธ๋กœ๋“œ ๋˜๋ ค๊ณ  ํ•  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค ! ๐Ÿ’ช

window.addEventListener("beforeunload", (e) => {
  const message = "์ž‘์„ฑ ์ค‘์ธ ๋‚ด์šฉ์ด ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •๋ง ๋‚˜๊ฐ€์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?";
  e.returnValue = message; // ๋Œ€๋ถ€๋ถ„์˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘
  return message;
});

ํ•„์š”ํ•œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊ฑฐ์˜ˆ์š” ! ๐Ÿ˜‰

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋’ค๋กœ๊ฐ€๊ธฐ ์ด๋ฒคํŠธ ๊ฐ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ• | devdong