es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

window.parent y window.top de repente son iguales a window.self

Tengo una aplicación web (B) que está hospedada en otra aplicación (A) usando un Iframe. Mi aplicación web puede enviar mensajes sin problemas (parent.postMessage(“mi mensaje”, “*”)) al padre, B.

Mi aplicación tiene un enlace que apunta a una aplicación web externa (C). El enlace contiene un redirectUrl que la aplicación C llamará (POST) cuando haya terminado. La URL apunta a una acción en mi aplicación. La acción termina asegurándose de que la ubicación actual sea la misma que antes de que el usuario hiciera clic en el enlace:

…
var response = Request.CreateResponse(HttpStatusCode.Found);
response.Headers.Location = new Uri(currentExecutionUrl);
return response;

Ahora, una vez que el usuario regresa a mi aplicación desde la aplicación C, ya no es posible enviar mensajes desde mi aplicación al padre, A. Al depurar el cliente, puedo ver la razón de esto: window.self, window.parent y window.top son todos idénticos y iguales a la ventana/documento de mi aplicación.

Ten en cuenta que esto solo ocurre con dispositivos iPhone / webkit. Con dispositivos Android y navegadores de escritorio, funciona como debería, es decir, las propiedades de las ventanas padre y superior apuntan a A como se esperaba.

¡Cualquier ayuda es apreciada!

Gracias,

Hank

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Posible solución para el problema de Postmessage en iPhone/Webkit

    Como se menciona en la declaración del problema, el problema con postmessage que no funciona en la ventana principal después de la redirección desde una aplicación web externa C solo ocurre en iPhone y navegadores basados en Webkit, mientras que funciona correctamente en dispositivos Android y navegadores de escritorio.

    Una posible solución para este problema podría ser usar el método window.opener.postMessage en la ventana secundaria (abierta por el enlace a la aplicación externa C) en lugar de parent.postMessage. Este método permite que la ventana secundaria envíe mensajes a la ventana principal incluso después de la redirección.

    Para implementar esta solución, podemos modificar el parámetro redirectUrl que se pasa a la aplicación web externa C para incluir una referencia a la ventana principal, de la siguiente manera:

    var redirectUrl = 'https://external-app-c.com?returnUrl=' + encodeURIComponent(window.location.href);
    

    Aquí, encodeURIComponent(window.location.href) codifica la URL actual de la aplicación, que se utilizará posteriormente para redirigir de nuevo a la misma página después de que la aplicación externa C se completen.

    Luego, en la ventana secundaria abierta por el enlace a la aplicación C, podemos usar el método window.opener.postMessage para enviar el mensaje a la ventana principal, de la siguiente manera:

    window.opener.postMessage("my message", "*");
    

    Esto debería permitir que la ventana principal (que hospeda el iframe con la aplicación web B) reciba el postmessage incluso después de la redirección desde la aplicación externa C.

    Espero que esta solución ayude a resolver el problema de postmessage en los navegadores de iPhone/Webkit. ¡Avísame si necesitas alguna ayuda adicional!

Comments are closed.