¿Hay alguna forma de detectar el src al que se redirigirá el iframe antes de cargarlo?

Tengo un iframe que no tengo control de su contenido. Dentro del iframe habrá redirección, en lugar de redirigir en la ventana superior (que espero), la redirección siempre ocurre en el iFrame. Probé la solución aquí: ¿Cómo obtener la URL de redirección antes de que ocurra la carga si no hay control sobre la redirección? pero el resultado no es ideal.

Ahora dentro de la página iframe que quiero usar $(window).unload() y cambiar manualmente el top.window.location.href para forzar la redirección en la ventana superior. Entonces, ¿alguien sabe cómo detectar la dirección a la que se redirigirá después del clic y antes del onload de la página redirigida? ¡Gracias!

PD: La página redirigida es del mismo dominio.

preguntado el 31 de diciembre de 12 a las 15:12

Déjame tratar de entender, 1) Tienes una página que controlas, con un iframe cuyo contenido no controlas. 2) Desea que su página navegue cuando alguna acción del usuario dentro del iframe obligue al iframe a navegar. ¿Es eso? -

Si, entiendes bien =) -

¿Mismo dominio o multidominio? -

Mismo dominio. Debería editar mi pregunta para que quede más clara :) -

1 Respuestas

Espero que esto pueda ayudarlo, solo funciona en el mismo contenido de iframe de dominio, el nuevo atributo sandbox ampliará las posibilidades, pero por ahora solo lo implementa Chrome.

1) Detectar cuando se carga el IF

myIF.addEventListener("load",ifOnLoad,true);

2) Obtenga una referencia a la ventana IF y registre un oyente para el evento onBeforeUnload cada vez que se carga el iframe.

ifContentWindow = myIF.contentWindow;
ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);

3) Cuando su controlador (ifOnUnload) llamará demasiado temprano para obtener la ubicación ifContentWindow., luego establezca un retraso para leerlo.

setTimeout(delayedIFUnload, 100);

4) En la función delayIFUnload obtenga la ubicación if y redirija su página principal.

window.location = ifContentWindow.location;

Solo pruebo el código en mi entorno (MAC, Chrome), necesita hacer algo de trabajo para ajustar el código para otros navegadores. Por ejemplo, con addEventListener o contentWindow.

Aquí está el enlace para el código de trabajo http://pannonicaquartet.com/test/testif.html, trato de hacerlo en fiddle pero Fiddle tiene muchos marcos y dentro de él el código no funciona correctamente. Yo uso un lapso para los mensajes porque en este tipo de operaciones se bloquea la alerta, al menos en Chrome.

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script language="javascript" type="text/javascript">
        var myIF, spNotify, ifContentWindow;
        function init(){
            myIF = document.getElementById("myIF");
            spNotify = document.getElementById("spNotify");
            myIF.src="testIF_1.html";
            myIF.addEventListener("load",ifOnLoad,true);
        }

        function ifOnLoad(){
            try{
                ifContentWindow = myIF.contentWindow;
                ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);
            }catch(er){
                alert(er);
            }
        }

        function ifOnUnload(){
            try{
                notify(ifContentWindow.location);
                setTimeout(delayedIFUnload, 100);
            }catch(er){
                alert(er);
            }
        }

        function delayedIFUnload(){
            try{
                notify(ifContentWindow.location);
            }catch(er){
                alert(er);
            }
        }

        function notify(what){
            spNotify.innerText = what;
        }
    </script>
</head>
<body onload="init();">
    <div id="dvMsg">Target: <span id = "spNotify"></span></div>
    <iframe  id="myIF" src=" " style="width:1100px;height:700px;" />
</body>

¡¡¡Feliz año nuevo!!!


<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Untitled Document</title>
    <script language="javascript" type="text/javascript">
        var myIF, spNotify, ifContentWindow, lastURL, timerRef;
        function init(){
            myIF = document.getElementById("myIF");
            spNotify = document.getElementById("spNotify");
            myIF.src="testIF_1.html";
            myIF.addEventListener("load",ifOnLoad,true);
        }

        function ifOnLoad(){
            try{
                ifContentWindow = myIF.contentWindow;
                ifContentWindow.addEventListener("beforeunload", ifOnUnload,false);
            }catch(er){
                alert(er);
            }
        }

        function ifOnUnload(){
            try{
                notify(ifContentWindow.location);
                lastURL = ifContentWindow.location;
                timerRef = setInterval(delayedIFUnload, 5);
            }catch(er){
                alert(er);
            }
        }

        function delayedIFUnload(){
            try{
                if(lastURL != ifContentWindow.location){
                    notify(ifContentWindow.location);
                    clearInterval(timerRef);
                }
            }catch(er){
                alert(er);
            }
        }

        function notify(what){
            spNotify.innerText = what;
        }
    </script>
</head>

Respondido el 02 de enero de 13 a las 12:01

¡Gracias por su respuesta detallada! Lo intentaré mañana en el trabajo :] - wceo

Siento decir que no funciona para mí... 100ms en setTimeout me parece demasiado corto, porque la ubicación devuelta es siempre la actual. Así que probé diferentes valores de 200 a 500. Cuando es 500, la nueva página se carga antes de que pudiera cambiar la window.location. - wceo

HI @wceo Edito la respuesta agregando un segundo enfoque un poco diferente, cambiando el tiempo de espera por un intervalo. Cuando la página principal detecte la descarga, agregue un temporizador que verifique periódicamente (intervalo de 5 ms) si la ubicación cambia. - HMarioD

@wceo otra posibilidad es agregar un oyente para Iframe.document.addEventListener('DOMContentLoaded', callback, false), se activará cuando el DOM esté listo y después de que se cargue el resto de la página, jquery lo usará. Espero que esto ayude. - HMarioD

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.