2012-09-11 26 views
5

Sé que el MessageEvent tiene la propiedad source que es el objeto de la ventana que envía el mensaje. Ahora, ¿cómo hacer que esta información compruebe qué iframe en el documento principal (y, por supuesto, dentro del documento principal sobre la llegada del mensaje) fue la fuente de ese mensaje en particular? ¿Solo está disponible la opción para marcar location.href en el objeto ventana event.source y luego recorrer todos los marcos flotantes para verificar cuál coincide? ¿Qué sucede si hay iframes con la misma URL de origen en el documento principal?cómo comprobar desde qué iframe de dominios cruzados llegó el mensaje (postMessage)?

Respuesta

1

Si intenta leer la propiedad location.href de un iframe/ventana entre dominios, esto generará una excepción ya que infringe la política de origen idéntico. Puede escribir en esa propiedad, pero no puede leer. E incluso si eso funcionara, tendrías el problema con múltiples iframes con el mismo problema de URL, como habrás adivinado.

De todos modos, lo que puede hacer es establecer un protocolo para algún tipo de confirmación de envío de mensajes. En otras palabras, en el iframe que recibe un mensaje X iterarás sobre todos los iframes en el documento principal y enviarás un mensaje a cada iframe preguntando "¿Me has enviado el mensaje X?" y usted programaría todos los iframes para responder a tales preguntas. Por supuesto, tendría que adjuntar identificadores únicos a todos los mensajes para que sepa qué iframe reconoció que envió qué mensaje.

Creo que debe pensar por qué el destinatario del mensaje necesita saber quién fue el remitente, y por qué no es suficiente que usted solo conozca la referencia a ese remitente (event.source)? Si el remitente conoce alguna información, entonces el remitente puede enviar esta información en primer lugar al mensaje.

+0

No si no tiene control del remitente, por supuesto. Tengo páginas con varias incrustaciones de Vimeo ocultas en cada una. Cuando el usuario hace clic en el botón para mostrar uno de ellos, debo esperar hasta recibir el mensaje "listo" del cuadro antes de enviarle un mensaje de "reproducción". Pero si tu respuesta es correcta, no tengo forma de saber qué iframe dijo que estaba lista. Eso parece un gran descuido para mí; No puedo entender cómo mejora la seguridad de ninguna manera, y no tener el control de la página iframe es un caso de uso increíblemente estándar. –

0

una manera más eficiente es pasar a los iframes cada uno una ID única en la iniciación, y hacer que utilicen esa identificación al publicar de nuevo en el marco principal.

0

Lo que estoy haciendo que parece funcionar hasta ahora en Chrome es iterar sobre todos los iframes en una página y hacer una comparación de identidad en sus objetos window.

window.addEventListener('message', function(e) { 
    if(e.origin === 'https://www.example.com') { 
     var iframes = document.getElementsByTagName('iframe'); 

     for(var i = 0; i < iframes.length; i++) { 
      if(e.source === iframes[i].contentWindow) { 
       // Do stuff with iframes[i] 
      } 
     } 
    } 
} 

Esto no ha sido probado en varios navegadores, por lo que su kilometraje puede variar.

Cuestiones relacionadas