HTML5 - Perpesanan web
Perpesanan web adalah kemampuan untuk mengirim pesan waktu nyata dari server ke browser klien. Ini mengesampingkan masalah komunikasi lintas domain di domain, protokol, atau port yang berbeda
Misalnya, Anda ingin mengirim data dari halaman Anda ke penampung iklan yang ditempatkan di iframe atau voice-versa, dalam skenario ini, Browser memberikan pengecualian keamanan. Dengan perpesanan web, kami dapat mengirimkan data sebagai acara pesan.
Pesan Acara
Peristiwa pesan diaktifkan Perpesanan lintas dokumen, perpesanan saluran, peristiwa yang dikirim server, dan soket web. Ini dijelaskan oleh antarmuka Peristiwa Pesan.
Atribut
Sr.No. | Atribut & Deskripsi |
---|---|
1 | data Berisi data string |
2 | origin Berisi nama domain dan port |
3 | lastEventId Berisi pengenal unik untuk acara pesan saat ini. |
4 | source Berisi referensi ke jendela dokumen asal |
5 | ports Berisi data yang dikirim oleh port pesan apa pun |
Mengirim pesan lintas dokumen
Sebelum mengirim pesan lintas dokumen, kita perlu membuat konteks penjelajahan web baru baik dengan membuat iframe baru atau jendela baru. Kita bisa mengirim data menggunakan dengan postMessage () dan itu memiliki dua argumen. Mereka adalah sebagai -
- message - Pesan yang akan dikirim
- targetOrigin - Nama asal
Contoh
Mengirim pesan dari iframe ke tombol
var iframe = document.querySelector('iframe');
var button = document.querySelector('button');
var clickHandler = function() {
iframe.contentWindow.postMessage('The message to send.',
'https://www.tutorialspoint.com);
}
button.addEventListener('click',clickHandler,false);
Menerima pesan lintas dokumen di dokumen penerima
var messageEventHandler = function(event){
// check that the origin is one we want.
if(event.origin == 'https://www.tutorialspoint.com') {
alert(event.data);
}
}
window.addEventListener('message', messageEventHandler,false);
Pesan saluran
Komunikasi dua arah antara konteks penelusuran disebut pesan saluran. Ini berguna untuk komunikasi lintas berbagai sumber.
Objek MessageChannel dan MessagePort
Saat membuat messageChannel, secara internal membuat dua port untuk mengirim data dan diteruskan ke konteks penelusuran lain.
postMessage() - Posting saluran lempar pesan
start() - Ini mengirimkan data
close() - Ini menutup port
Dalam skenario ini, kami mengirim data dari satu iframe ke iframe lain. Di sini kita memanggil data dalam fungsi dan meneruskan data ke DOM.
var loadHandler = function() {
var mc, portMessageHandler;
mc = new MessageChannel();
window.parent.postMessage('documentAHasLoaded','http://foo.example',[mc.port2]);
portMessageHandler = function(portMsgEvent) {
alert( portMsgEvent.data );
}
mc.port1.addEventListener('message', portMessageHandler, false);
mc.port1.start();
}
window.addEventListener('DOMContentLoaded', loadHandler, false);
Kode di atas, mengambil data dari port 2, sekarang akan meneruskan data ke iframe kedua
var loadHandler = function() {
var iframes, messageHandler;
iframes = window.frames;
messageHandler = function(messageEvent) {
if( messageEvent.ports.length > 0 ) {
// transfer the port to iframe[1]
iframes[1].postMessage('portopen','http://foo.example',messageEvent.ports);
}
}
window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);
Sekarang dokumen kedua menangani data dengan menggunakan fungsi portMsgHandler.
var loadHandler() {
// Define our message handler function
var messageHandler = function(messageEvent) {
// Our form submission handler
var formHandler = function() {
var msg = 'add <[email protected]> to game circle.';
messageEvent.ports[0].postMessage(msg);
}
document.forms[0].addEventListener('submit',formHandler,false);
}
window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);