2009-07-08 27 views
22

Escuché que HTML5 tiene window.postMessage(), pero parece requerir tener un control en la ventana (o pestaña, a lo largo de esta pregunta) a la que está publicando el mensaje. ¿Qué pasa si quiero transmitir a todas las ventanas abiertas? es posible?Enviando un mensaje a todas las ventanas/pestañas abiertas usando JavaScript

(Lo que estoy tratando de hacer es advertir a otras ventanas sin ningún servidor de ida y vuelta cuando un usuario hace algo en una ventana que afecta a los demás, para que puedan actualizar su contenido. Sin embargo, mientras que algunas ventanas pueden ser abierto desde los existentes, lo que me permite interceptar y almacenar referencias a ellos, el usuario puede abrir manualmente algunas ventanas nuevas y luego seleccionar un marcador o una URL ingresada. En este caso, no parece haber una manera de interceptar y almacenar referencias.)

+0

Dependiendo del caso de uso, el cometa (u otro MECANISMO similares "hybi") podría ser una mejor opción; por ejemplo, si desea que la notificación sea entre navegadores (es decir, si el usuario ha abierto IE y Firefox, realiza un cambio en IE y espera que se notifique a Firefox). Además, no sé exactamente cómo funcionan todos los navegadores (puede haber opciones configurables que cambien su comportamiento predeterminado, como el argumento de línea de comandos -no-remote para Firefox), pero incluso para el mismo navegador, es posible que no todas las ventanas puedan para comunicarse sin comunicaciones estilo Comet/servidor. –

+0

Gracias, pero ya tengo un respaldo del lado del servidor ... Solo quería que se sintiera un poco más ágil al ser más eficiente cuando sea posible. – Kev

+0

¿Por qué esta pregunta se cierra como un duplicado, cuando la que supuestamente duplicaba vino 6 años después? – Kev

Respuesta

19

IMO esto no es posible con el uso de postMessage. ¿Qué tal el uso de sessionStorage localStorage? Escribir en él debería generar un evento de almacenamiento que se debe propagar a todas las ventanas que comparten el mismo almacenamiento de sesión.

+0

O las cookies (siempre que estén en el mismo dominio) –

+3

las cookies también pueden ser una solución, pero la ventaja del almacenamiento es que genera eventos al realizar operaciones en él. Cuando utilice cookies, deberá verificar cada X segundos (setInterval) para nuevas cookies y otro problema sería cuándo eliminar la cookie. – Rafael

+0

No sabía acerca de los eventos de sesión: la documentación de sessionStorage de MDC es un poco confusa. Gracias por el liderazgo! – Kev

26

Escribí una biblioteca para hacer esto: intercom.js (por las mismas razones que describió).

Actualmente lo estamos usando para difundir notificaciones a todas las ventanas, por lo que solo una ventana necesita mantener una conexión de socket al servidor. Como algunos otros sugirieron, usa la API local Storage.

El uso es muy simple:

var intercom = Intercom.getInstance(); 

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

para coger el mensaje,

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

La interfaz está diseñada para imitar socket.io.

+0

Esto se ve muy bien. Pregunta tonta, pero ¿funciona esto entre diferentes dominios? No esperaría que los eventos 'Storage' funcionaran en ventanas en diferentes dominios ya que tendrán su propio' localStorage'. Sé que podría probarlo, pero pensé que podría preguntar – Ian

+1

Tiene que estar en el mismo dominio:/Si * realmente * quieres volverte loco, probablemente te vuelvas loco con iframes y postMessage + Intercom para obtener algo trabajo entre dominios. – brianreavis

+0

¿Funcionaría esto efectivamente como una alternativa para los trabajadores web compartidos? Intento configurar un webworker cuyos datos se comparten entre pestañas, no muy diferente de su enlace para socket.io, excepto que se está comunicando con el trabajador en lugar de con un servidor. Si la pestaña con el trabajador está cerrada, debería relanzarse en una pestaña diferente. –

Cuestiones relacionadas