เมธอด setAttributeNode() ของ Element ใช้ **เพิ่มหรือแทนที่ attribute node** ให้กับองค์ประกอบโดยตรง คล้าย setNamedItem() แต่เรียกผ่าน element แทน attributes collection
รูปแบบการใช้งาน
// สร้าง attribute node
const attr = document.createAttribute('attribute-name');
attr.value = 'attribute-value';
// ตั้งค่าให้ element
const replacedAttr = element.setAttributeNode(attr);
// คืนค่า Attr node เดิมที่ถูกแทนที่ (ถ้ามี) หรือ null
ตัวอย่างการใช้งาน
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: sans-serif; padding: 2rem; text-align: center;
background: linear-gradient(135deg, #FBAB7E 0%, #F7CE68 100%);
min-height: 100vh; color: #333; }
h1 { color: #23CE6B; }
p {
background: #fff;
padding: 1.5rem;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
max-width: 600px;
margin: 2rem auto;
font-size: 1.1rem;
transition: all 0.3s ease;
}
.btn {
background: #0197F6;
color: white;
border: none;
padding: 12px 24px;
border-radius: 6px;
cursor: pointer;
font-weight: bold;
font-size: 1rem;
}
.btn:hover { background: #0077cc; transform: translateY(-2px); }
.code { background: #f5f5f5; padding: 1rem; border-radius: 8px; text-align: left; font-family: monospace; font-size: 0.9rem; margin: 1rem auto; max-width: 600px; }
</style>
</head>
<body>
<h1>DOM setAttributeNode() Method Demo</h1>
<p id="targetPara">ย่อหน้านี้จะได้รับ style attribute ใหม่เมื่อกดปุ่ม</p>
<button class="btn" onclick="setStyleAttribute()">
ตั้งค่า style attribute ด้วย setAttributeNode()
</button>
<div class="code" id="codeDisplay">คลิกปุ่มด้านบนเพื่อดูโค้ดที่รัน</div>
<script>
function setStyleAttribute() {
const para = document.getElementById('targetPara');
const codeDisplay = document.getElementById('codeDisplay');
// สร้าง attribute node
const styleAttr = document.createAttribute('style');
styleAttr.value = 'color: #db133a; font-size: 1.5rem; font-weight: bold; text-shadow: 2px 2px 4px rgba(0,0,0,0.2);';
// แสดงโค้ด
codeDisplay.innerHTML = `
const attr = document.createAttribute('style');
attr.value = '${styleAttr.value}';
element.setAttributeNode(attr);
`;
// ใช้ setAttributeNode (บน element โดยตรง)
const replaced = para.setAttributeNode(styleAttr);
if (replaced) {
log('แทนที่ attribute เดิม: ' + replaced.name);
} else {
log('เพิ่ม attribute ใหม่');
}
}
function log(msg) {
console.log(msg);
}
</script>
</body>
</html>
setAttributeNode vs setAttribute vs setNamedItem
| เมธอด | เรียกผ่าน | คืนค่า | ใช้เมื่อไหร่ |
|---|---|---|---|
element.setAttributeNode(attrNode) |
Element | Attr node เดิม / null | มี Attr node อยู่แล้ว ต้องการคืนค่าเก่า |
element.attributes.setNamedItem(attrNode) |
NamedNodeMap | Attr node เดิม / null | ทำงานกับ attribute collection โดยตรง |
element.setAttribute(name, value) |
Element | undefined | ใช้งานทั่วไป ง่ายที่สุด |
element.setAttributeNS(ns, name, value) |
Element | undefined | XML namespaces (SVG, MathML, XLink) |
ตัวอย่างขั้นสูง: จัดการ Attribute Nodes
<script>
const el = document.createElement('div');
// 1. สร้างและเพิ่ม attributes
const idAttr = document.createAttribute('id');
idAttr.value = 'my-element';
el.setAttributeNode(idAttr);
const classAttr = document.createAttribute('class');
classAttr.value = 'container main';
el.setAttributeNode(classAttr);
// 2. อ่าน attribute node
const retrievedId = el.attributes.getNamedItem('id');
console.log('ID attribute node:', retrievedId); // Attr { name: "id", value: "my-element" }
// 3. แทนที่ attribute
const newClassAttr = document.createAttribute('class');
newClassAttr.value = 'container updated';
const oldClassAttr = el.setAttributeNode(newClassAttr);
console.log('Old class value:', oldClassAttr.value); // "container main"
// 4. ลบ attribute
const removed = el.attributes.removeNamedItem('id');
console.log('Removed:', removed.name, removed.value);
// 5. ตรวจสอบผลลัพธ์
console.log('Final element:', el.outerHTML);
//
</script>
Attr Node Object (คุณสมบัติ)
| คุณสมบัติ | คำอธิบาย |
|---|---|
name |
ชื่อ attribute (read-only) |
value |
ค่าของ attribute (read/write) |
specified |
true หากระบุใน HTML อย่างชัดเจน (read-only) |
ownerElement |
Element ที่ attribute นี้เป็นของ (read-only) |
namespaceURI |
Namespace URI (สำหรับ XML namespaces) |
prefix |
Namespace prefix |
localName |
Local name (ไม่รวม prefix) |
แนวทางปฏิบัติที่ดีที่สุด
ส่วนใหญ่ควรใช้
setAttribute() แทน เพราะ:
- API เรียบง่ายกว่า (string name, string value)
- ไม่ต้องสร้าง Attr object แยกต่างหาก
- ประสิทธิภาพดีกว่าเล็กน้อย
- โค้ดอ่านง่ายกว่า
setAttributeNode() เฉพาะเมื่อต้องการ Attr node object หรือทำงานกับ namespaces