hx-trigger
hx-trigger
μμ±μ AJAX μμ²μ νΈλ¦¬κ±°νλ λ°©λ²μ μ§μ ν μ μκ² ν΄μ€λλ€. νΈλ¦¬κ±° κ°μ λ€μ μ€ νλμΌ μ μμ΅λλ€:
every <timing declaration>
νμμ polling μ μclick
κ³Ό κ°μ νμ€ μ΄λ²€νΈλ λ€μκ³Ό κ°μ΄ νΈλ¦¬κ±°λ‘ μ§μ ν μ μμ΅λλ€:
<div hx-get="/clicked" hx-trigger="click">Click Me</div>
μ΄λ²€νΈλ μ΄λ²€νΈ μ΄λ¦ λ€μ λκ΄νΈλ‘ κ°μΌ 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
λΌλ μ΄λ¦μ μ μ κΈ°νΈλ₯Ό μ°Ύμ΅λλ€.
νμ€ μ΄λ²€νΈμλ λμμ λ³κ²½νλ μμ μκ° μμ μ μμ΅λλ€. μμ μλ λ€μκ³Ό κ°μ΅λλ€:
once
- μ΄λ²€νΈκ° ν λ²λ§ νΈλ¦¬κ±°λ©λλ€ (μ: 첫 λ²μ§Έ ν΄λ¦).changed
- μμμ κ°μ΄ λ³κ²½λ κ²½μ°μλ§ μ΄λ²€νΈκ° νΈλ¦¬κ±°λ©λλ€. μ£Όμν μ μ change
λ μ΄λ²€νΈ μ΄λ¦μ΄κ³ , changed
λ μμ μ μ΄λ¦μ
λλ€.delay:<timing declaration>
- μ΄λ²€νΈκ° μμ²μ νΈλ¦¬κ±°νκΈ° μ μ μ§μ°μ΄ λ°μν©λλ€. μ΄λ²€νΈκ° λ€μ λ°μνλ©΄ μ§μ°μ΄ μ΄κΈ°νλ©λλ€.throttle:<timing declaration>
- μ΄λ²€νΈκ° μμ²μ νΈλ¦¬κ±°ν νμ μ€λ‘νμ΄ λ°μν©λλ€. μ§μ°μ΄ μλ£λκΈ° μ μ μ΄λ²€νΈκ° λ€μ λ°μνλ©΄ 무μλκ³ , μ§μ°μ΄ λλ λ μμκ° νΈλ¦¬κ±°λ©λλ€.from:<Extended CSS selector>
- μμ²μ νΈλ¦¬κ±°νλ μ΄λ²€νΈκ° λ¬Έμμ λ€λ₯Έ μμμμ λ°μνλλ‘ νμ©ν©λλ€ (μ: λ¨μΆν€λ₯Ό μ§μνκΈ° μν΄ bodyμμ ν€ μ΄λ²€νΈλ₯Ό λ£λ κ²½μ°).
from:input
μ νμ΄μ§μ λͺ¨λ μ
λ ₯ μμλ₯Ό λ£μ΅λλ€.document
- λ¬Έμμμ μ΄λ²€νΈλ₯Ό λ£μ΅λλ€.window
- μ°½μμ μ΄λ²€νΈλ₯Ό λ£μ΅λλ€.closest <CSS selector>
- μ£Όμ΄μ§ CSS μ νμμ μΌμΉνλ κ°μ₯ κ°κΉμ΄ μμ μμ λλ μκΈ° μμ μ μ°Ύμ΅λλ€.find <CSS selector>
- μ£Όμ΄μ§ CSS μ νμμ μΌμΉνλ κ°μ₯ κ°κΉμ΄ μμμ μ°Ύμ΅λλ€.next
λ element.nextElementSiblingμΌλ‘ ν΄μλ©λλ€.next <CSS selector>
λ μ£Όμ΄μ§ CSS μ νμμ μΌμΉνλ 첫 λ²μ§Έ μμλ₯Ό μ°Ύμ DOMμ μμΌλ‘ μ€μΊν©λλ€ (μ: next .error
λ error
ν΄λμ€λ₯Ό κ°μ§ κ°μ₯ κ°κΉμ΄ λ€μ νμ μμλ₯Ό λμμΌλ‘ ν©λλ€).previous
λ element.previousElementSiblingμΌλ‘ ν΄μλ©λλ€.previous <CSS selector>
λ μ£Όμ΄μ§ CSS μ νμμ μΌμΉνλ 첫 λ²μ§Έ μμλ₯Ό μ°Ύμ DOMμ λ€λ‘ μ€μΊν©λλ€ (μ: previous .error
λ error
ν΄λμ€λ₯Ό κ°μ§ κ°μ₯ κ°κΉμ΄ μ΄μ νμ μμλ₯Ό λμμΌλ‘ ν©λλ€).target:<CSS selector>
- μ΄λ²€νΈμ λμμ CSS μ νμλ‘ νν°λ§ν μ μμ΅λλ€. μ΄λ μ΄κΈ°ν μμ μ DOMμ μλ μμμμ νΈλ¦¬κ±°λ₯Ό λ£κ³ μ ν λ μ μ©ν©λλ€. μλ₯Ό λ€μ΄, bodyμμ λ£μ§λ§ νμ μμμ λν λμ νν°λ₯Ό μ¬μ©νμ¬ μ΄κΈ°ν μμ μ DOMμ μμ μ μλ μμμ νΈλ¦¬κ±°λ₯Ό μμ νλ €λ κ²½μ°μ μ μ©ν μ μμ΅λλ€.consume
- μ΄ μ΅μ
μ΄ ν¬ν¨λλ©΄ μ΄λ²€νΈκ° λΆλͺ¨ μμμμ λ€λ₯Έ htmx μμ²μ νΈλ¦¬κ±°νμ§ μμ΅λλ€ (λλ λΆλͺ¨ μμμμ λ£λ μμμμλ).queue:<queue option>
- λ€λ₯Έ μ΄λ²€νΈμ λν μμ²μ΄ μ§ν μ€μΌ λ μ΄λ²€νΈκ° λ°μνλ©΄ μ΄λ²€νΈκ° νμ μ΄λ»κ² μ μ₯λ μ§λ₯Ό κ²°μ ν©λλ€. μ΅μ
μ λ€μκ³Ό κ°μ΅λλ€:
first
- 첫 λ²μ§Έ μ΄λ²€νΈλ₯Ό νμ μ μ₯ν©λλ€.last
- λ§μ§λ§ μ΄λ²€νΈλ₯Ό νμ μ μ₯ν©λλ€ (κΈ°λ³Έκ°).all
- λͺ¨λ μ΄λ²€νΈλ₯Ό νμ μ μ₯ν©λλ€ (κ° μ΄λ²€νΈμ λν μμ²μ λ°νν©λλ€).none
- μλ‘μ΄ μ΄λ²€νΈλ₯Ό νμ μ μ₯νμ§ μμ΅λλ€.λ€μμ keyup
μ κ²μλμ§λ§ κ²μ κ°μ΄ λ³κ²½λκ³ μ¬μ©μκ°
1μ΄ λμ μλ‘μ΄ λ΄μ©μ μ
λ ₯νμ§ μμ κ²½μ°μλ§ κ²μλλ κ²μμ°½μ μμ
λλ€:
<input name="q"
hx-get="/search" hx-trigger="keyup changed delay:1s"
hx-target="#search-results"/>
/search
URLμ μλ΅μ idκ° search-results
μΈ div
μ μΆκ°λ©λλ€.
htmxλ λͺ κ°μ§ λΉνμ€ μ΄λ²€νΈλ₯Ό μ§μν©λλ€:
load
- λ‘λ μ νΈλ¦¬κ±°λ¨ (μ§μ° λ‘λμ μ μ©)revealed
- μμκ° λ·°ν¬νΈμ μ€ν¬λ‘€λ λ νΈλ¦¬κ±°λ¨ (μ§μ° λ‘λμ μ μ©). CSSμμ overflow-y: scroll
κ³Ό κ°μ overflow
λ₯Ό μ¬μ©νλ κ²½μ° revealed
λμ intersect once
λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.intersect
- μμκ° λ·°ν¬νΈμ μ²μ κ΅μ°¨ν λ ν λ² νΈλ¦¬κ±°λ¨. μ΄ μ΄λ²€νΈλ λ κ°μ§ μΆκ° μ΅μ
μ μ§μν©λλ€:
root:<selector>
- κ΅μ°¨λ₯Ό μν λ£¨νΈ μμμ CSS μ νμthreshold:<float>
- μ΄λ²€νΈλ₯Ό νΈλ¦¬κ±°ν κ΅μ°¨ λΉμ¨μ λνλ΄λ 0.0μμ 1.0 μ¬μ΄μ λΆλ μμμ μ«μHX-Trigger
headerHX-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μμ λ£λ κ²½μ°κ° λ§μ΅λλ€.
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>
μ¬λ¬ νΈλ¦¬κ±°λ₯Ό μΌνλ‘ κ΅¬λΆνμ¬ μ 곡ν μ μμ΅λλ€. κ° νΈλ¦¬κ±°λ κ³ μ ν μ΅μ μ κ°μ§λλ€.
<div hx-get="/news" hx-trigger="load, click delay:1s"></div>
μ΄ μμ λ νμ΄μ§ λ‘λ μ μ¦μ /news
λ₯Ό λ‘λνκ³ , ν΄λ¦ ν 1μ΄μ μ§μ° ν λ€μ λ‘λν©λλ€.
AJAX μμ²μ JavaScript htmx.trigger()
λ₯Ό ν΅ν΄μλ νΈλ¦¬κ±°ν μ μμ΅λλ€.
hx-trigger
λ μμλμ§ μμ΅λλ€.hx-trigger
λ AJAX μμ² μμ΄λ μ¬μ©ν μ μμΌλ©°, μ΄ κ²½μ° htmx:trigger
μ΄λ²€νΈλ§ νΈλ¦¬κ±°ν©λλ€.form input
)λ₯Ό from
λλ target
μμ μμ μ λ¬νλ €λ©΄ μ νμλ₯Ό κ΄νΈλ μ€κ΄νΈλ‘ κ°μΈμΌ ν©λλ€ (μ: from:(form input)
λλ from:nearest (form input)
).