Now.js Framework Documentation
data-html
data-html
ภาพรวม
data-html แสดงผล HTML content ภายใน element ต่างจาก data-text ตรงที่จะตีความค่าเป็น HTML ทำให้แสดงเนื้อหาที่มีการจัดรูปแบบได้
ใช้เมื่อ:
- แสดง rich text content จาก CMS หรือ API
- แสดง HTML ที่แปลงจาก markdown
- แสดงคำอธิบายหรือบทความที่มี formatting
ทำไมต้องใช้:
- ✅ แสดง HTML markup อย่างถูกต้อง
- ✅ มี sanitization ในตัวเพื่อความปลอดภัย
- ✅ อัพเดทแบบ reactive เมื่อข้อมูลเปลี่ยน
- ✅ ประมวลผล nested directives หลัง rendering
การใช้งานพื้นฐาน
HTML Binding อย่างง่าย
<div data-html="content"></div>กับข้อมูล:
{ content: "<strong>ตัวหนา</strong> และ <em>ตัวเอียง</em>" }ผลลัพธ์:
<div><strong>ตัวหนา</strong> และ <em>ตัวเอียง</em></div>จาก API Response
<article data-html="article.body"></article>Syntax
<element data-html="expression">| ส่วน | คำอธิบาย |
|---|---|
expression |
Data path หรือ expression ที่คืนค่า HTML string |
ฟีเจอร์
1. แสดง Rich Content
<div class="content" data-html="post.content"></div>กับข้อมูล:
{
post: {
content: `
<h2>ยินดีต้อนรับ</h2>
<p>นี่คือย่อหน้าที่มี <strong>การจัดรูปแบบ</strong></p>
<ul>
<li>รายการที่ 1</li>
<li>รายการที่ 2</li>
</ul>
`
}
}2. รองรับ Nested Directives
HTML content สามารถมี data directives อื่นได้:
<div data-html="template"></div>กับข้อมูล:
{
template: '<span data-text="user.name"></span>',
user: { name: "สมชาย" }
}data-text ที่ซ้อนอยู่จะถูกประมวลผลหลัง rendering
3. Sanitization
โดยค่าเริ่มต้น เนื้อหาอันตรายจะถูกลบออก:
// Script อันตราย - จะถูกลบ
{ content: "<script>alert('xss')</script><p>เนื้อหาปลอดภัย</p>" }
// ผลลัพธ์: <p>เนื้อหาปลอดภัย</p>4. Tags ที่อนุญาต
TemplateManager อนุญาต HTML tags เหล่านี้:
| หมวดหมู่ | Tags |
|---|---|
| โครงสร้าง | div, span, p, section, article, header, footer, nav, main, aside |
| ข้อความ | h1-h6, strong, em, b, i, u, s, mark, small, sub, sup |
| รายการ | ul, ol, li, dl, dt, dd |
| ลิงก์ | a, button |
| สื่อ | img, video, audio, picture, source, figure, figcaption |
| ตาราง | table, thead, tbody, tfoot, tr, th, td, caption |
| ฟอร์ม | form, input, textarea, select, option, label, fieldset |
| อื่นๆ | br, hr, blockquote, pre, code, time, details, summary |
ตัวอย่างขั้นสูง
แสดงบทความบล็อก
<article class="blog-post">
<header>
<h1 data-text="post.title"></h1>
<time data-text="post.publishedAt | date:'D MMMM YYYY'"></time>
</header>
<div class="content" data-html="post.body"></div>
<footer>
<span>โดย: </span>
<span data-text="post.author.name"></span>
</footer>
</article>คำอธิบายสินค้า
<div class="product-description">
<h3>รายละเอียด</h3>
<div data-html="product.description"></div>
<h3>คุณสมบัติ</h3>
<div data-html="product.features"></div>
</div>เนื้อหาจากผู้ใช้
<div class="comment">
<div class="author" data-text="comment.author"></div>
<div class="body" data-html="comment.content"></div>
<time data-text="comment.date | date:'relative'"></time>
</div>API อ้างอิง
Expression Syntax
| Expression | ตัวอย่าง | คำอธิบาย |
|---|---|---|
| Property ธรรมดา | data-html="content" |
เข้าถึง state property |
| Nested property | data-html="post.body" |
เข้าถึง nested object |
| กับ fallback | data-html="a \|\| b" |
ใช้ fallback ถ้าเป็น falsy |
การตั้งค่าความปลอดภัย
TemplateManager.config.security = {
sanitize: true, // เปิด sanitization
validateMarkup: true, // ตรวจสอบโครงสร้าง HTML
allowedTags: [...], // Whitelist ของ tags ที่อนุญาต
allowedAttributes: {...} // Whitelist ของ attributes ที่อนุญาต
}ข้อควรระวัง
⚠️ 1. อย่าใช้กับข้อความธรรมดา
<!-- ❌ เกินความจำเป็นสำหรับข้อความธรรมดา -->
<span data-html="user.name"></span>
<!-- ✅ ใช้ data-text สำหรับข้อความธรรมดา -->
<span data-text="user.name"></span>⚠️ 2. ช่องโหว่ XSS
// ❌ อย่าเชื่อ input จากผู้ใช้โดยไม่ sanitize
const userInput = '<script>stealCookies()</script>';
// ✅ TemplateManager sanitize โดยค่าเริ่มต้น
// แต่ยังต้อง validate ที่ฝั่ง server ด้วย!⚠️ 3. ประสิทธิภาพกับเนื้อหาใหญ่
<!-- ❌ อาจช้ากับ HTML ขนาดใหญ่มาก -->
<div data-html="massiveContent"></div>
<!-- ✅ พิจารณาใช้ pagination หรือ lazy loading -->
<div data-html="currentPageContent"></div>เปรียบเทียบ: data-text vs data-html
| คุณสมบัติ | data-text | data-html |
|---|---|---|
| แสดง HTML | ไม่ (escaped) | ใช่ |
| ป้องกัน XSS | เสมอ | กับ sanitization |
| ประสิทธิภาพ | เร็วกว่า | ช้ากว่าเล็กน้อย |
| Formatters | ใช่ | ไม่ |
| กรณีใช้งาน | ข้อความธรรมดา | Rich content |