Now.js Framework Documentation
data-on
data-on
ภาพรวม
data-on ผูก event handlers กับ elements รองรับ event modifiers สำหรับรูปแบบทั่วไปเช่น การป้องกัน default behavior, key filtering และอื่นๆ
ใช้เมื่อ:
- จัดการ interactions จากผู้ใช้ (clicks, inputs ฯลฯ)
- ตอบสนอง keyboard events
- จัดการ form submissions
ทำไมต้องใช้:
- ✅ Event binding แบบ declarative
- ✅ มี 20+ built-in modifiers
- ✅ Cleanup อัตโนมัติเมื่อ element ถูกลบ
- ✅ รองรับ method arguments
การใช้งานพื้นฐาน
Click Handler
<button data-on="click:handleClick">คลิกที่นี่</button>ใน JavaScript:
function handleClick(event) {
console.log('ปุ่มถูกคลิก!');
}กับ Arguments
<button data-on="click:deleteItem(item.id)">ลบ</button>function deleteItem(id, event) {
console.log('ลบรายการ:', id);
}Syntax
<element data-on="eventType.modifier1.modifier2:methodName(args)">| ส่วน | คำอธิบาย |
|---|---|
eventType |
ชื่อ DOM event (click, input, keydown ฯลฯ) |
.modifier |
Modifiers ทางเลือก (ต่อกันได้หลายตัว) |
methodName |
Function ที่จะเรียก |
(args) |
Arguments ทางเลือก |
Event Types
รองรับ DOM events มาตรฐานทั้งหมด:
| หมวดหมู่ | Events |
|---|---|
| เมาส์ | click, dblclick, mousedown, mouseup, mousemove, mouseenter, mouseleave |
| คีย์บอร์ด | keydown, keyup, keypress |
| ฟอร์ม | submit, input, change, focus, blur |
| สัมผัส | touchstart, touchend, touchmove |
| เลื่อน | scroll, wheel |
| ลาก | drag, dragstart, dragend, drop |
Modifiers Reference
Event Behavior Modifiers
| Modifier | คำอธิบาย | เทียบเท่า |
|---|---|---|
.prevent |
ป้องกัน default behavior | event.preventDefault() |
.stop |
หยุด event propagation | event.stopPropagation() |
.once |
จัดการ event ครั้งเดียว | { once: true } |
.capture |
ใช้ capture phase | { capture: true } |
.self |
เฉพาะ target เป็น element เอง | event.target === element |
.trusted |
เฉพาะ trusted events | event.isTrusted |
Key Modifiers
| Modifier | ปุ่ม |
|---|---|
.enter |
ปุ่ม Enter |
.tab |
ปุ่ม Tab |
.esc |
ปุ่ม Escape |
.space |
Space bar |
Mouse Button Modifiers
| Modifier | ปุ่ม |
|---|---|
.left |
ปุ่มซ้ายเมาส์ (button 0) |
.right |
ปุ่มขวาเมาส์ (button 2) |
.middle |
ปุ่มกลางเมาส์ (button 1) |
System Key Modifiers
| Modifier | ปุ่ม |
|---|---|
.ctrl |
ปุ่ม Control ค้างไว้ |
.alt |
ปุ่ม Alt ค้างไว้ |
.shift |
ปุ่ม Shift ค้างไว้ |
.meta |
ปุ่ม Meta/Command ค้างไว้ |
ฟีเจอร์
1. Basic Event Handling
<button data-on="click:save">บันทึก</button>
<input data-on="input:handleInput">
<form data-on="submit:handleSubmit">2. Prevent Default
<!-- ป้องกัน form submission -->
<form data-on="submit.prevent:handleSubmit">
<button type="submit">ส่ง</button>
</form>
<!-- ป้องกัน link navigation -->
<a href="#" data-on="click.prevent:openModal">เปิด Modal</a>3. Stop Propagation
<div data-on="click:closeModal">
<div class="modal" data-on="click.stop:noop">
<!-- คลิกที่นี่จะไม่ปิด modal -->
</div>
</div>4. Key Modifiers
<!-- Trigger เมื่อกด Enter -->
<input data-on="keydown.enter:search">
<!-- Trigger เมื่อกด Escape -->
<div data-on="keydown.esc:closeModal">
<!-- Trigger เมื่อกด Tab -->
<input data-on="keydown.tab:moveToNext">5. Modifier Combinations
<!-- Ctrl+Enter เพื่อส่ง -->
<textarea data-on="keydown.ctrl.enter:submit"></textarea>
<!-- Shift+Click -->
<div data-on="click.shift:selectRange"></div>
<!-- Ctrl+S เพื่อบันทึก -->
<div data-on="keydown.ctrl.s.prevent:save"></div>6. Multiple Event Bindings
<input
data-on="focus:onFocus, blur:onBlur, input:onInput">7. Method Arguments
<!-- ส่ง data properties -->
<button data-on="click:deleteUser(user.id)">ลบ</button>
<!-- ส่งค่า literal -->
<button data-on="click:setStatus('active')">เปิดใช้งาน</button>
<!-- ส่งหลาย arguments -->
<button data-on="click:updateItem(item.id, 'published')">เผยแพร่</button>
<!-- ส่ง index ในลูป -->
<div data-for="item in items">
<template>
<button data-on="click:selectItem(index)">เลือก</button>
</template>
</div>ตัวอย่างขั้นสูง
ฟอร์มกับ Validation
<form data-on="submit.prevent:handleSubmit">
<input
type="email"
name="email"
data-on="input:validateEmail, blur:validateEmail">
<input
type="password"
name="password"
data-on="keydown.enter:handleSubmit, input:validatePassword">
<button type="submit">เข้าสู่ระบบ</button>
</form>Keyboard Shortcuts
<div class="editor"
data-on="
keydown.ctrl.s.prevent:save,
keydown.ctrl.z.prevent:undo,
keydown.ctrl.shift.z.prevent:redo,
keydown.esc:closeEditor
">
<textarea data-model="content"></textarea>
</div>Drag and Drop
<div class="dropzone"
data-on="
dragenter.prevent:onDragEnter,
dragover.prevent:onDragOver,
dragleave:onDragLeave,
drop.prevent:onDrop
">
<p>วางไฟล์ที่นี่</p>
</div>
<div class="draggable"
draggable="true"
data-on="dragstart:onDragStart">
ลากฉัน
</div>Context Menu
<div class="item"
data-on="contextmenu.prevent:showContextMenu">
คลิกขวาเพื่อดูตัวเลือก
</div>Infinite Scroll
<div class="scroll-container"
data-on="scroll:handleScroll">
<div data-for="item in items">
<template>
<div class="item" data-text="item.name"></div>
</template>
</div>
<div data-if="isLoading" class="loader">กำลังโหลด...</div>
</div>function handleScroll(event) {
const container = event.target;
if (container.scrollTop + container.clientHeight >= container.scrollHeight - 100) {
loadMoreItems();
}
}API อ้างอิง
Handler Signature
function handlerName(arg1, arg2, ..., event) {
// Arguments ที่ส่งใน data-on มาก่อน
// Event object เป็น parameter สุดท้ายเสมอ
}Event Object
Native DOM Event object จะถูกส่งเป็น argument สุดท้าย:
| Property | คำอธิบาย |
|---|---|
event.target |
Element ที่ trigger event |
event.currentTarget |
Element ที่มี listener |
event.type |
ประเภท event (click, input ฯลฯ) |
event.key |
ปุ่มที่กด (สำหรับ keyboard events) |
event.button |
ปุ่มเมาส์ (สำหรับ mouse events) |
ข้อควรระวัง
⚠️ 1. ไม่พบ Function
<!-- ❌ Function ต้อง global หรืออยู่ใน component methods -->
<button data-on="click:localFunction">คลิก</button>
<!-- ✅ ทำให้เป็น global -->
<script>
window.myHandler = function(e) { ... };
</script>
<button data-on="click:myHandler">คลิก</button>⚠️ 2. ขาด Prevent บน Forms
<!-- ❌ Form จะ submit และ reload หน้า -->
<form data-on="submit:handleSubmit">
<!-- ✅ ป้องกัน default submission -->
<form data-on="submit.prevent:handleSubmit">⚠️ 3. ปัญหา Event Bubbling
<!-- ❌ Inner click trigger outer handler ด้วย -->
<div data-on="click:closeDropdown">
<button data-on="click:toggleDropdown">สลับ</button>
</div>
<!-- ✅ Stop propagation บน inner element -->
<div data-on="click:closeDropdown">
<button data-on="click.stop:toggleDropdown">สลับ</button>
</div>⚠️ 4. Button Default Type
Buttons ภายใน forms จะ default เป็น type="submit":
<!-- ❌ นี่จะ submit form -->
<form>
<button data-on="click:doSomething">คลิก</button>
</form>
<!-- ✅ กำหนด type ชัดเจน -->
<form>
<button type="button" data-on="click:doSomething">คลิก</button>
</form>หมายเหตุ:
data-onเพิ่ม.stopmodifier อัตโนมัติสำหรับ clicks บน buttons เพื่อป้องกันปัญหานี้
Modifier Combinations Quick Reference
| รูปแบบ | กรณีใช้งาน |
|---|---|
click.prevent |
Links ที่ trigger JS |
submit.prevent |
AJAX form submission |
click.stop |
ป้องกัน bubbling ไป parent |
keydown.enter.prevent |
Enter submits โดยไม่ขึ้นบรรทัดใหม่ |
keydown.ctrl.s.prevent |
Custom save shortcut |
click.once |
One-time actions |
click.self |
เฉพาะ direct clicks |
Directives ที่เกี่ยวข้อง
- data-model - สำหรับ form input binding
- data-if - สำหรับ conditional rendering
- data-for - สำหรับ event handlers ในลูป