๐ window.history.pushState์ history.replaceState์ ์์๋ณด์
history.pushState()๋ ๋ธ๋ผ์ฐ์ ์ ์ธ์
๊ธฐ๋ก ์คํ์ ์๋กญ๊ฒ ์ถ๊ฐํ๋ค. ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์๋ฐ, (pushState(state, unused, url?)) state๋ ์ฌ์ฉ์๊ฐ ์๋ก์ด ํ์ด์ง๋ก ์ด๋ํ ๋๋ง๋ค popstate ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค. unused๋ ์ญ์ฌ์ ์ด์ ๋ก ์กด์ฌํ๋ฉฐ, ์๋ตํ ์ ์๋ค. ์ถํ์ ๋ณ๊ฒฝ ์์ ์ด๋ฏ๋ก ๋น๋ถ๊ฐ ๋น ๋ฌธ์์ด('')์ ์ฌ์ฉํ์. url์ ์ฌ์ฉํ๋ฉด ํด๋น URL๋ก ์ด๋ํ์ง ์์ง๋ง, ๋์ค์ ์ฌ์ฉ์๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ ์์ํ๋ฉด ํด๋น URL ๋ก๋๋ฅผ ์๋ํ ์ ์๋ค. ๋ฐํ ๊ฐ์ undefined์ด๋ค.
ํฌ์ธํธ๋ URL๊ฐ์ ํ์ฌ URL๊ณผ ๋์ผํ ์ถ์ฒ(same origin)์ฌ์ผ ํ๋๋ฐ, ์๋ฅผ ๋ค์ด ํ์ฌ ํ์ด์ง๊ฐ www.google.com์ธ๋ฐ, history.pushState({ foo: 'bar' }, "", 'https://www.naver.com/')์ ์ฌ์ฉ ํ ์ ์๋ค. ๋ง์ฝ, ์ธ๋ถ URL์ ํธ์ถํ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.

history.pushState()์ window.location = "#foo"์ ํ์ฌ ํ์ด์ง์ history๋ฅผ ์์ฑํ๋๊ฒ์ ๊ฐ์ง๋ง, history.pushState()์ ์ด์ (advantage)์ด ์กฐ๊ธ ๋ ํฌ๋ค.
history.pushState()์์ ์ฌ์ฉํ๋URL์same origin์ด๋ค. ๋ฐ๋ฉดwindow.location์hash๋ง ์์ ํ๋ ๊ฒฝ์ฐ์ ๋์ผํ ํ์ด์ง๋ก ์ ์ง๋๋ค.- ์ธ ๋ฒ์งธ ์ธ์์
URL์optional์ด์ง๋ง,window.location = "#foo"์ ๊ฐ์ ๊ฒฝ์ฐ๋ ํ์ฌhash๊ฐ์ด#foo๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์๋ก์ดhistory๋ฅผ ๋ง๋ ๋ค. - ์์์ ๋ฐ์ดํฐ๋ฅผ ์
historyํญ๋ชฉ์ ์ฐ๊ฒฐํ ์ ์๋ค.hash๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ฌธ์์ด๋ก ์ธ์ฝ๋ฉํด์ผ ํ๋ค. - ์ URL์ด ์ด์ URL๊ณผ ํด์๋ง ๋ฌ๋ผ๋
pushState()๋ ์ ๋hashchange์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
history.replaceState()๋ history.pushState()์ ๋น์ทํ์ง๋ง, ํ depth์ session history๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ์ ์์ history.pushState()์ ๋ค๋ฅด๋ค. (history.pushState()๋ session history์ ์๋ก์ด ์ธ์
๊ธฐ๋ก์ ์ถ๊ฐํ๋ค.) ๋ฌธ๋ฒ์ history.pushState()์ ๋์ผํ๊ฒ replaceState(stateObj, un(used, url?)๋ก ์์ฑํ๋ค. ๋ฐํ ๊ฐ์ undefined์ด๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ ํ์ด์ง(https://www.mozilla.org/foo.html)์์ ์ ํญ์ ๋ค์์ ์
๋ ฅํด๋ณด์. history.pushState({ foo: 'bar' }, '', 'bar.html'); ๊ทธ๋ฐ ํ ์ฝ์์ฐฝ์ history๋ฅผ ์
๋ ฅํ๋ฉด ์ฌ์ ํ length๊ฐ 1๊ฐ์ธ ๊ฒ์ ์ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ ์ ์๋ ์ ์ history.pushState()์ ๋ค๋ฅด๊ฒ session history์ ์๋ก์ด history๋ฅผ ์ถ๊ฐํ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด์ ์๋ session history๊ฐ์ ๋ฐฉ๊ธ ์ ์ธํ ๊ฐ์ผ๋ก ๋์ฒดํ ๊ฒ์ด๋ค. ๋ history์ state๋ฅผ ๋ณด๋ฉด ๊ธฐ์กด์ ์๋ state: { foo: 'bar' }๊ฐ ์๊ธด ๊ฒ์ ์ ์ ์๋ค. ๊ทธ๋ค์ history.replaceState({ bar: 'baz' },'', 'bar2.html')๋ฅผ ์
๋ ฅํด๋ณด๋ฉด ์ฌ์ ํ length๊ฐ 1๊ฐ์ด๋ค. ์์๋์ด์ผ ํ ์ ์ ์ธ ๋ฒ์งธ ์ธ์์ธ URL ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฃ๋๋ค๊ณ ํด๋ ๋ธ๋ผ์ฐ์ ๋ bar2.html๊ฐ ์กด์ฌํ๋์ง ํ์ธํ์ง ์๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ฃผ์ ํ์์ฐฝ์ www.naver.com์ ์
๋ ฅํ์ฌ ์ํฐ๋ฅผ ํด๋ฆญํ๊ณ ๋ธ๋ผ์ฐ์ ์ ๋ค๋ก ๊ฐ๊ธฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ง์ง๋ง์ ์์ฑํ bar2.html์ด ๋์ค๊ณ ํ๋ฒ ๋ ๋ค๋ก ๊ฐ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด bar.html ๋์ foo.html๊ฐ ๋์ค๊ณ bar.html์ ์์ ํ ์ฐํํ๋ค๋ ์ ์ ์ ์ ์๋ค.
Reference
๋๊ธ