hx-trigger

hx-trigger 속성은 AJAX μš”μ²­μ„ νŠΈλ¦¬κ±°ν•˜λŠ” 방법을 지정할 수 있게 ν•΄μ€λ‹ˆλ‹€. 트리거 값은 λ‹€μŒ 쀑 ν•˜λ‚˜μΌ 수 μžˆμŠ΅λ‹ˆλ‹€:

Standard Events

clickκ³Ό 같은 ν‘œμ€€ μ΄λ²€νŠΈλŠ” λ‹€μŒκ³Ό 같이 트리거둜 지정할 수 μžˆμŠ΅λ‹ˆλ‹€:

<div hx-get="/clicked" hx-trigger="click">Click Me</div>

Standard Event Filters

μ΄λ²€νŠΈλŠ” 이벀트 이름 뒀에 λŒ€κ΄„ν˜Έλ‘œ 감싼 boolean JavaScript ν‘œν˜„μ‹μ„ ν¬ν•¨ν•˜μ—¬ 필터링할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν‘œν˜„μ‹μ΄ true둜 ν‰κ°€λ˜λ©΄ μ΄λ²€νŠΈκ°€ 트리거되고, 그렇지 μ•ŠμœΌλ©΄ λ¬΄μ‹œλ©λ‹ˆλ‹€.

<div hx-get="/clicked" hx-trigger="click[ctrlKey]">Control Click Me</div>

이 μ΄λ²€νŠΈλŠ” 클릭 μ΄λ²€νŠΈκ°€ event.ctrlKey 속성이 true둜 μ„€μ •λœ κ²½μš°μ— νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.

이 쑰건식은 μ „μ—­ ν•¨μˆ˜λ‚˜ μƒνƒœλ₯Ό μ°Έμ‘°ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

<div hx-get="/clicked" hx-trigger="click[checkGlobalState()]">Control Click Me</div>

λ˜ν•œ ν‘œμ€€ JavaScript ꡬ문을 μ‚¬μš©ν•˜μ—¬ κ²°ν•©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€:

<div hx-get="/clicked" hx-trigger="click[ctrlKey&&shiftKey]">Control-Shift Click Me</div>

λͺ¨λ“  κΈ°ν˜ΈλŠ” λ¨Όμ € 트리거 이벀트λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄μ„λ˜κ³ , λ‹€μŒμœΌλ‘œ μ „μ—­ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄μ„λ©λ‹ˆλ‹€. λ”°λΌμ„œ myEvent[foo]λŠ” λ¨Όμ € μ΄λ²€νŠΈμ—μ„œ fooλΌλŠ” 속성을 μ°Ύκ³ , λ‹€μŒμœΌλ‘œ fooλΌλŠ” μ΄λ¦„μ˜ μ „μ—­ 기호λ₯Ό μ°ΎμŠ΅λ‹ˆλ‹€.

Standard Event Modifiers

ν‘œμ€€ μ΄λ²€νŠΈμ—λŠ” λ™μž‘μ„ λ³€κ²½ν•˜λŠ” μˆ˜μ •μžκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μˆ˜μ •μžλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

λ‹€μŒμ€ keyup μ‹œ κ²€μƒ‰λ˜μ§€λ§Œ 검색 값이 λ³€κ²½λ˜κ³  μ‚¬μš©μžκ°€ 1초 λ™μ•ˆ μƒˆλ‘œμš΄ λ‚΄μš©μ„ μž…λ ₯ν•˜μ§€ μ•Šμ€ κ²½μš°μ—λ§Œ κ²€μƒ‰λ˜λŠ” κ²€μƒ‰μ°½μ˜ μ˜ˆμž…λ‹ˆλ‹€:

<input name="q"
       hx-get="/search" hx-trigger="keyup changed delay:1s"
       hx-target="#search-results"/>

/search URL의 응닡은 idκ°€ search-results인 div에 μΆ”κ°€λ©λ‹ˆλ‹€.

Non-standard Events

htmxλŠ” λͺ‡ 가지 λΉ„ν‘œμ€€ 이벀트λ₯Ό μ§€μ›ν•©λ‹ˆλ‹€:

Triggering via the HX-Trigger header

HX-Trigger 응닡 헀더λ₯Ό 톡해 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•˜λ €λŠ” 경우 from:body μˆ˜μ •μžλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 응닡과 ν•¨κ»˜ HX-Trigger: my-custom-event와 같은 헀더λ₯Ό 보낸닀면, μš”μ†ŒλŠ” λ‹€μŒκ³Ό κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€:

  <div hx-get="/example" hx-trigger="my-custom-event from:body">
    Triggered by HX-Trigger header...
  </div>

μ΄λ ‡κ²Œ ν•΄μ•Ό μ΄λ²€νŠΈκ°€ λ°œμƒν•©λ‹ˆλ‹€.

μ΄λŠ” 헀더가 νŠΈλ¦¬κ±°ν•˜λ €λŠ” μš”μ†Œμ™€ λ‹€λ₯Έ DOM 계측 κ΅¬μ‘°μ—μ„œ 이벀트λ₯Ό νŠΈλ¦¬κ±°ν•  κ°€λŠ₯성이 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λΉ„μŠ·ν•œ 이유둜 단좕킀λ₯Ό bodyμ—μ„œ λ“£λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

Polling

every <timing declaration> ꡬ문을 μ‚¬μš©ν•˜μ—¬ μš”μ†Œκ°€ 주기적으둜 Pollingν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

<div hx-get="/latest_updates" hx-trigger="every 1s">
  Nothing Yet!
</div>

이 μ˜ˆμ œλŠ” /latest_updates URL에 맀초 GET μš”μ²­μ„ 보내고 κ²°κ³Όλ₯Ό 이 div의 innerHTML에 κ΅μ²΄ν•©λ‹ˆλ‹€.

Polling에 ν•„ν„°λ₯Ό μΆ”κ°€ν•˜λ €λ©΄, ν•„ν„°λŠ” Polling μ„ μ–Έ 뒀에 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€:

<div hx-get="/latest_updates" hx-trigger="every 1s [someConditional]">
  Nothing Yet!
</div>

Multiple Triggers

μ—¬λŸ¬ 트리거λ₯Ό μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 각 νŠΈλ¦¬κ±°λŠ” κ³ μœ ν•œ μ˜΅μ…˜μ„ κ°€μ§‘λ‹ˆλ‹€.

  <div hx-get="/news" hx-trigger="load, click delay:1s"></div>

이 μ˜ˆμ œλŠ” νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ μ¦‰μ‹œ /newsλ₯Ό λ‘œλ“œν•˜κ³ , 클릭 ν›„ 1초의 지연 ν›„ λ‹€μ‹œ λ‘œλ“œν•©λ‹ˆλ‹€.

Via JavaScript

AJAX μš”μ²­μ€ JavaScript htmx.trigger()λ₯Ό ν†΅ν•΄μ„œλ„ νŠΈλ¦¬κ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Notes