🕛 global hx-boost + <script defer>
지금까지의 스토리🧚🔮🧌
htmx hx-boost을 사용하여, 블로그내의 링크이동을 빠르고 가볍게 만들었다.
그런데, 페이지가 로딩된 다음 자동으로 실행될 자바스크립트를 지정하기 어려워졌다. 사례로 위 (2)-을 구현하는데에 현재 선택된 정렬기준을 표시해주는 JS이 페이지 로딩 때에 자동으로 실행됐으면 했는데 그게 좀 어려웠다…
hx-boost와 onload 🦻
페이지가 로딩됐을때, JS이 실행되도록 하는 방법은 여러 가지가 있…:
onload, ready, DOMContentLoaded 모두 조금씩 다른데 여기서는
소개하지 않겠다. 인터넷에 충분히 많은 좋은 설명이 있으니까.
그런데 공통점은: JS코드를 실행해서 ‘원하는 시점’에 실행하길 원하는 코드를 등록하는 방식,이란 점이다.
문제는 hx-boost-와 엮일 때에 발생했다: hx-boost은 웹브라우저의
현재페이지 컨텍스트를 모두 지우고, 새로 이동하는 페이지의 컨텍스트로
다시 시작하는 것이 아니라, 현재 페이지의 컨텍스트를 그대로 유지한
채, 새로운 페이지의 내용으로 그 컨텍스트를 변형해 나가는 방식이기
때문.
그래서 생기는 문제는:
- hx-boost 링크를 통해 로드한 페이지에서 등록한
onload-등의 ‘이벤트핸들러’들이 실행되지 않는다.
대안 htmx:afterSwap ?
실제로 hx-boost이 페이지의 내용을 변화시킨것일뿐, 웹브라우저의 관점에서는 페이지컨텍스트를 새로 만든 것이 아니므로 그런 이벤트핸들러를 실행시켜주지 않기 때문. 😥
그래서 대안으로, Event - htmx:afterSwap-을 지정할 수 있음.
hx-boost-이 DOM을 변형한 이후에 실행해주기 때문에 onload에
유사하게 기대한 것처럼 동작할 수 있다. 🤩
…하지만, 다음과 같은 문제가 여전히 있다. ☠️
-
global hx-boost: 특정페이지를 위한 콜백을 실행해주는
htmx:afterSwap이벤트를 지정하기 곤란하다.-
global hx-boost => htmx:afterSwap => per-page callback 호출하는 구조를 만들수는 있을 것 같다. 🩵
- 하지만 일종의 특별한 이름/구조의 뭔가를 만들어주는 것이니 일단은 피하고 싶다.
-
-
global hx-boost이 지정된 위치가 아닌, 불러들인 페이지의 요소에 htmx:afterSwap 지정을 지원하지는 않는 것 같다. 👪
- 예: 불러온 페이지에서
<div ... hx-on::after-swap="doThis(...)">같이 지정할 방법. - 그런 방식이 가능하다면, 위 (1.1)-을 따로 구성할 필요도 없이 불러들이는 페이지마다 이렇게 지정하기만 하면 될테니.
- 예: 불러온 페이지에서
<script defer>
결국 특정한 시점을 JS에서 지정하거나, 등록하는 일들을 일반적인
웹브라우저 페이지이동 <=> hx-boost 간에 서로 잘 호환되지 못하는거
같다.
hx-boost으로 불러들인 페이지는 그 페이지의 모든 <script> 등을 다
실행해주지만 시점을 지정하는 것이 어려웠을 뿐이었어서.
==> 그래서 <script defer>-을 활용하는걸 좀 더 열심히 하게 되었다.
아직까진 적당히 의도대로 동작해 주는거 같다. ㅎㅎ🤑