Hay un par de maneras de pasar un mensaje de varias partes a un controlador postMessage
. La primera (y menos "limpia") es usar un carácter delimitador, luego pasar sus datos a través de una cadena.
Digamos que queríamos pasar una identificación de usuario, una acción y el nombre de los usuarios. La cadena podría tener este aspecto:
54|do_logout|chris
Dentro del manejador postMessage
, los datos transmitidos pueden ser split
(docs) en el carácter |
, a continuación, cada segmento del mensaje puede ser utilizado como sea necesario.
Otra ruta, en lugar de crear/dividir manualmente una cadena, es usar JSON (docs) para convertir un objeto en una cadena en un lado, y usar JSON para convertir de nuevo a un objeto en el manejador.
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(JSON.stringify(pass_data), "http://www.example.net");
... entonces en el controlador:
function (event) {
var pass_data = JSON.parse(event.data);
}
Asegúrese de probar, sin embargo, como el objeto JSON
no se proporciona en todas las aplicaciones de usuario, especialmente los más antiguos. Hay muchas (muchas, muchas) bibliotecas de terceros para mejorar el soporte de JSON, así que no dejes que la falta de una adopción completa te asuste: JSON es definitivamente un estándar seguro para "seguir adelante".
¿No sería mejor si pudiéramos pasar ese objeto inmediatamente? Bueno, mirando a Firefox 6 (source), los datos que pases a un manejador de postmensaje pueden ser un objeto. El objeto se serializa, por lo que hay algunas preocupaciones en ese frente, pero:
var pass_data = {
'name':'Chris',
'id':54,
'action':'do_logout'
};
target_window.postMessage(pass_data, "http://www.example.net");
Un poco más agradable, ¿eh? Desafortunadamente, las versiones actuales de IE solo se ocuparán de las cadenas. No pude encontrar ninguna discusión sobre planes futuros con respecto a postMessage
para IE 10. Además, hay un error conocido en IE 8/9 que rompe postMessage
para cualquier cosa que no sean marcos. (source).
Entrar en un aspecto específico de su pregunta - devoluciones de llamada. A menos que pueda pasar la devolución de llamada por nombre de función, no hay forma de pasar una función; no hay funciones anónimas para ti Esto está relacionado con la manera en que los datos se pasan al manejador. En la práctica, no hay soporte para los objetos como datos, detrás de las escenas el navegador está convirtiendo su objeto pasado en una cadena (serialización).
Dicho todo esto, debe comprender que pasar un objeto es exactamente lo mismo que utilizar JSON a stringify
un objeto antes de pasar, solo en el caso anterior el navegador está realizando su propia serialización (y posterior deserialización), mientras que con esta última ruta, depende de usted serializar/deserializar.
Los puntos de comida para llevar aquí:
- postMessage todavía ha limitado cross-browser apoyo
- La tendencia de las nuevas versiones de los navegadores compatible con los estándares es para permitir el paso de los objetos, además de cadenas
- El objeto pasado se serializará, por lo que no se permiten referencias de función
- El soporte más amplio "en la naturaleza" es para datos solo de cadena, lo que significa que tendrá que usar cadenas y "empacar" sus datos como se demostró anteriormente si quieres apoyar una variedad ide de los agentes de usuario
- Internet Explorer va a arruinar todos los planes que usted hace siempre (incluyendo los días festivos de la familia)
documentación y referencias
No estoy seguro de lo que quiere decir; usted es libre de examinar un mensaje recibido e invocar condicionalmente un código diferente, etc., así que ... – Pointy
Es que hasta ahora, no he visto ningún ejemplo de eso, y por lo que he leído, la correspondencia no puede enviar objetos o cualquier cosa, lo que significa que tendría que diseccionar la cuerda ... simplemente no parece muy limpio. – johnnietheblack