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
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.
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.
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.
- 1. Obtiene el contenido de DOM del iframe de dominios cruzados
- 2. Autenticación de dominios cruzados
- 3. Dominio IFrame de dominios cruzados, acceso desde el JavaScript de los padres
- 4. AJAX de dominios cruzados: ¿funcionaría este método?
- 5. ¿Cómo puedo hacer postMessage entre dominios?
- 6. iframe de mensajería a través de dominios con jQuery postMessage complemento
- 7. ¿Por qué funciona realmente esta llamada ajax de dominios cruzados?
- 8. Solicitudes de dominios cruzados con jQuery
- 9. cómo permitir solicitudes de dominios cruzados en tomcat?
- 10. Comunicación iframe entre dominios
- 11. Cerrar iframe dominios
- 12. El beneficio de CORS sobre mensajería de dominios cruzados
- 13. jQuery - Cómo eliminar la limitación de dominios cruzados
- 14. scripts de sitios cruzados con Iframe
- 15. ¿Cómo cambiar el estilo del contenido de iframe entre dominios?
- 16. Bloquear llamadas de dominios cruzados al servicio web asp.net .asmx
- 17. detectar redireccionamientos de dominios cruzados en la solicitud de ajax
- 18. ¿Por qué html5 postMessage no funciona para mí?
- 19. mensajes de dominios cruzados a la aplicación ASP.Net MVC
- 20. iframe altura dinámica dominio cruzado usando jquery.ba-postmessage
- 21. Cómo cerrar iframe desde dentro de iframe?
- 22. ¿Por qué no se permite la llamada AJAX de dominios cruzados?
- 23. ¿Se consideran dominios cruzados diferentes puertos en el mismo servidor? (Ajax-wise)
- 24. Cómo limitar la visualización del iframe desde un sitio externo a dominios específicos solamente
- 25. PostMessage desde WorkerThread a la ventana principal en MFC
- 26. ¿Cómo configuro las cookies desde dominios externos dentro de iframes en Safari?
- 27. Permitir que solo ciertos dominios puedan cargar un iFrame
- 28. PostMessage() tiene éxito pero mi código de procesamiento de mensajes nunca recibe el mensaje
- 29. ¿Cómo maneja Firebase problemas cruzados de origen?
- 30. Obtener el documento de los padres del iFrame
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. –