2009-07-08 12 views
22

Ho sentito che HTML5 ha window.postMessage(), ma sembra che sia necessario avere un handle sulla finestra (o scheda, in tutta questa domanda) a cui stai postando il messaggio. Cosa succede se voglio trasmettere a tutte le finestre aperte? È possibile?Invio di un messaggio a tutte le finestre/schede aperte utilizzando JavaScript

(Quello che sto cercando di fare è avvertire le altre finestre senza alcun round-trip del server quando un utente fa qualcosa in una finestra che influenza le altre, in modo che possano aggiornare il loro contenuto. aperto da quelli esistenti - permettendomi di intercettare e memorizzare i riferimenti ad essi - alcune nuove finestre possono essere aperte manualmente dall'utente e poi un segnalibro selezionato o un URL digitato. In questo caso non sembra essere un modo per intercettare e memorizzare riferimenti.)

+0

A seconda del caso d'uso, Comet (o altri simili mecanism "HyBi") potrebbe essere una scelta migliore; ad esempio se si desidera che la notifica sia cross-browser (ovvero, l'utente ha aperto IE e Firefox, apporta una modifica in IE e si aspetta che Firefox venga avvisato). Inoltre, non so esattamente come funzionino tutti i browser (potrebbero esserci opzioni configurabili che cambiano il loro comportamento predefinito, come l'argomento della riga di comando -no-remote per Firefox) ma anche per lo stesso browser, tutte le finestre potrebbero non essere in grado comunicare senza comunicazioni in stile Comet/server. –

+0

Grazie, ma ho già un fallback sul lato server ... Volevo solo che si sentisse un po 'più nitido essendo più efficiente quando possibile. – Kev

+0

Perché questa domanda è stata chiusa come duplicata, quando quella che presumibilmente è stata duplicata è arrivata 6 anni dopo? – Kev

risposta

19

IMO questo non è possibile utilizzando il messaggio post. Che ne dici di usare sessionStorage localStorage? Scrivere su di esso dovrebbe generare un evento di archiviazione che deve essere propagato a tutte le finestre che condividono la stessa memoria di sessione.

+0

Oppure i cookie (purché si trovino nello stesso dominio) I cookie –

+3

potrebbero anche essere una soluzione, ma il vantaggio dell'archiviazione è che genera eventi durante l'esecuzione di operazioni su di esso. Quando si utilizzano i cookie, è necessario verificare ogni X secondi (setInterval) per i nuovi cookie e un altro problema potrebbe essere quando rimuovere il cookie. – Rafael

+0

Non sapevo nulla degli eventi di sessione - La sessione di MDC La documentazione di archivio è un po 'confusa. Grazie per il piombo! – Kev

26

Ho scritto una libreria per fare proprio questo: intercom.js (per gli stessi motivi che hai delineato).

Attualmente lo stiamo utilizzando per trasmettere notifiche a tutte le finestre, quindi solo una finestra deve mantenere una connessione socket al server. Come altri hanno suggerito, utilizza l'API localStorage.

L'uso è molto semplice:

var intercom = Intercom.getInstance(); 

$('a').on('click', function() { 
    intercom.emit('notice', {message: 'Something just happened!'); 
}); 

per catturare il messaggio,

intercom.on('notice', function(notice) { 
    console.log(notice.message); 
}); 

L'interfaccia è progettata per imitare socket.io.

+0

Sembra molto bello. Domanda stupida, ma funziona tra domini diversi? Non mi aspetterei che gli eventi 'Storage' funzionino su Windows in domini diversi poiché avranno il loro' localStorage'. So che potrei provarlo, ma ho pensato di chiedere allo – Ian

+1

Deve essere nello stesso dominio:/Se * davvero * volevi impazzire potresti probabilmente diventare pazzo con iframe e postMessage + Interfono per ottenere qualcosa funzionamento interdominio. – brianreavis

+0

Questo funzionerebbe efficacemente come ripiego per i lavoratori Web condivisi? Sto provando a creare un webworker i cui dati sono condivisi tra le schede, non diversamente dall'associazione per socket.io, eccetto che sta comunicando con l'operatore anziché con un server. Se la scheda con il lavoratore è chiusa, dovrebbe essere riavviata su una scheda diversa. –

Problemi correlati