onmessage ใน HTML5 เป็น Event Attribute ที่ใช้สำหรับการรับข้อความ (message) ที่ส่งมาจาก Web Workers หรือจากหน้าต่างอื่น (เช่น ผ่าน postMessage() เมื่อมีการส่งข้อมูลระหว่าง iframe, window, หรือ web worker) ในกรณีที่มีการสื่อสารระหว่างกันผ่าน JavaScript
การใช้งาน onmessage Event Attribute
- การสื่อสารระหว่าง
iframeและหน้าต่างหลัก- เราสามารถใช้
onmessageเพื่อรับข้อความที่ส่งมาจากiframeหรือจากหน้าต่างอื่นโดยใช้วิธีการpostMessage()
- เราสามารถใช้
- การสื่อสารกับ Web Worker
- เมื่อมีการทำงานเบื้องหลังโดยใช้ Web Workers เราสามารถใช้
onmessageเพื่อรับข้อมูลจาก Web Worker ที่ทำงานอยู่เบื้องหลังนั้น
- เมื่อมีการทำงานเบื้องหลังโดยใช้ Web Workers เราสามารถใช้
การใช้ onmessage กับ iframe และ postMessage()
HTML
<!-- main.html -->
<!DOCTYPE html>
<html>
<body>
<iframe id="myFrame" src="iframe.html" style="width:300px;height:200px;"></iframe>
<script>
// ตั้งค่าให้ตัวหลักฟังข้อความที่ถูกส่งเข้ามา
window.onmessage = function(event) {
if (event.origin !== "http://example.com") {
return; // ตรวจสอบแหล่งที่มาของข้อความเพื่อความปลอดภัย
}
console.log("ข้อความที่รับจาก iframe:", event.data);
};
// ส่งข้อความไปยัง iframe
var iframe = document.getElementById("myFrame");
iframe.contentWindow.postMessage("Hello from main page!", "http://example.com");
</script>
</body>
</html>HTML
<!-- iframe.html -->
<!DOCTYPE html>
<html>
<body>
<script>
// รับข้อความที่ส่งมาจากหน้าต่างหลัก
window.onmessage = function(event) {
if (event.origin !== "http://example.com") {
return; // ตรวจสอบแหล่งที่มาของข้อความเพื่อความปลอดภัย
}
console.log("ข้อความที่รับจากหน้าต่างหลัก:", event.data);
// ส่งข้อความกลับไปยังหน้าต่างหลัก
event.source.postMessage("Hello from iframe!", event.origin);
};
</script>
</body>
</html>
ในตัวอย่างนี้มีการสื่อสารระหว่างหน้าต่างหลักและ iframe ผ่าน onmessage และ postMessage() โดยการตรวจสอบ event.origin เพื่อป้องกันการโจมตีจากแหล่งที่มาไม่รู้จัก
การใช้ onmessage กับ Web Worker
HTML
<!DOCTYPE html>
<html>
<body>
<button onclick="startWorker()">Start Worker</button>
<button onclick="stopWorker()">Stop Worker</button>
<script>
var worker;
function startWorker() {
if (typeof(Worker) !== "undefined") {
if (typeof(worker) == "undefined") {
worker = new Worker("worker.js");
}
// รอรับข้อความจาก Worker
worker.onmessage = function(event) {
console.log("ข้อความที่รับจาก Worker:", event.data);
};
} else {
console.log("Web Workers ไม่รองรับในเบราว์เซอร์นี้");
}
}
function stopWorker() {
worker.terminate();
worker = undefined;
}
</script>
</body>
</html>JavaScript
// worker.js
var i = 0;
function timedCount() {
i = i + 1;
postMessage(i); // ส่งข้อความกลับไปยัง main thread
setTimeout(timedCount, 1000);
}
timedCount();ในตัวอย่างนี้ Web Worker จะส่งข้อความ (i) กลับไปยัง main thread ทุก ๆ 1 วินาที ซึ่ง main thread จะรับข้อมูลนั้นผ่าน onmessage และสามารถแสดงข้อมูลหรือประมวลผลได้ตามต้องการ
การประยุกต์ใช้งาน onmessage
- การอัปเดตข้อมูลแบบเรียลไทม์
- สามารถใช้
onmessageสำหรับการอัปเดตข้อมูลระหว่างหน้าต่างต่าง ๆ โดยไม่ต้อง refresh หน้า
- สามารถใช้
- การแบ่งงานหนักไปยัง Web Workers
- สำหรับงานที่ใช้เวลาประมวลผลนานหรือกินทรัพยากร CPU สูง สามารถแบ่งงานไปยัง Web Worker และรับผลลัพธ์ผ่าน
onmessage
- สำหรับงานที่ใช้เวลาประมวลผลนานหรือกินทรัพยากร CPU สูง สามารถแบ่งงานไปยัง Web Worker และรับผลลัพธ์ผ่าน
- การสื่อสารข้ามโดเมน
- สามารถใช้
onmessageเพื่อสื่อสารข้ามโดเมนหรือข้าม iframe ได้อย่างปลอดภัย ผ่านการตรวจสอบevent.origin
- สามารถใช้
