2009-04-15 8 views
72

Estoy tratando de detectar cuándo se ha cargado un iframe y su contenido pero no tiene mucha suerte. Mi solicitud toma alguna entrada en campos de texto en la ventana padre y actualiza el marco flotante para proporcionar una 'vista previa en vivo'Detectando cuando el contenido del iframe se ha cargado (navegador cruzado)

Empecé con el siguiente código (YUI) para detectar cuando se produce el evento de carga de marco flotante.

$E.on('preview-pane', 'load', function(){ 
    previewBody = $('preview-pane').contentWindow.document.getElementsByTagName('body')[0]; 
} 

'vista previa de una ventana' es el ID de mi iframe y estoy usando YUI para fijar el controlador de eventos. Sin embargo, al intentar acceder al cuerpo en mi devolución de llamada (en caso de carga iframe) falla, creo que porque el iframe se carga antes de que el controlador de eventos esté listo. Este código funciona si retraso la carga del iframe haciendo que el script php que lo genera duerma.

Básicamente, estoy preguntando cuál es el enfoque correcto en los navegadores para detectar cuándo se ha cargado el iframe y su documento está listo.

+1

Comenzando con YUI es una mala idea (así como cualquier otra biblioteca JS). ¿Por qué? Porque no puedes saber qué magia está haciendo esa biblioteca. Si no pueden soportar la "carga" por completo, será mejor que lo hagas tú mismo en JavaScript legible y legible. – Christian

+2

A menudo puede leer el código fuente de la biblioteca @Christian. Encuentro que esto generalmente te da buenos consejos sobre cómo hacerlo tú mismo, independientemente de si luego usas su implementación o no. – AJP

+0

@AJP Has malinterpretado mi punto. Si está haciendo algo de lo que no está seguro, es mejor tener menos código, por lo que hay menos margen para errores. – Christian

Respuesta

58

para detectar cuando el iframe ha cargado y su documento está listo?

Es ideal si puedes obtener el iframe para que te diga a ti mismo desde un script dentro del marco. Por ejemplo, podría llamar a una función primaria directamente para decirle que está lista. Siempre se requiere cuidado con la ejecución del código de cuadros cruzados, ya que las cosas pueden suceder en un orden que no espera. Otra alternativa es establecer 'var isready = true;' en su propio ámbito, y hacer que el script padre olfatee para 'contentWindow.isready' (y agregue el controlador onload si no es así).

Si por alguna razón no es práctico tener el documento marco flotante cooperar, usted tiene el problema de la carga de la carrera tradicional, es decir, que incluso si los elementos están uno al lado del otro:

<img id="x" ... /> 
<script type="text/javascript"> 
    document.getElementById('x').onload= function() { 
     ... 
    }; 
</script> 

no hay garantía de que el artículo no se haya cargado antes de que se ejecute el script.

Las formas de salir de carga-razas son:

  1. en IE, puede utilizar la propiedad ‘readyState’ para ver si hay algo que ya está cargada;

  2. si el elemento disponible solo con JavaScript habilitado es aceptable, puede crearlo dinámicamente, configurando la función de evento 'onload' antes de configurar el origen y adjuntarlo a la página. En este caso, no se puede cargar antes de que se establezca la devolución de llamada;

  3. el camino de la vieja escuela de incluirla en el marcado:

    <img onload="callback(this)" ... />

Inline 'onsomething' manipuladores en HTML son casi siempre las cosas mal y que deben evitarse, pero en este a veces es la opción menos mala.

+0

Gracias. Mi solución verifica el readyState (si existe), luego los elementos del cuerpo innerHTML length para ver si se ha cargado. Si no, conecta el controlador de eventos de carga. Parece que funciona bien –

+7

-1 - los eventos en línea no son "malos", esa es la moda actual. De hecho, los eventos en línea son más fáciles de depurar y comprender, a diferencia de sus contrapartes mágicas (que, por otro lado, son más fáciles de adjuntar, apilar y usar sin interrupciones). – Christian

+0

@Christian, los eventos en línea también son la mejor opción cuando necesita adjuntar un evento a cada elemento de una lista muy larga. Como ya está haciendo un bucle para compilar la lista desde el lado del servidor, también es mucho más eficiente adjuntar el evento en línea. – haknick

43

Ver la publicación del blog this. Utiliza jQuery, pero debería ayudarte incluso si no lo estás usando.

Básicamente se agrega esto a su document.ready()

$('iframe').load(function() { 
    RunAfterIFrameLoaded(); 
}); 
+0

Interesante, pero el problema que tengo es con los eventos de carga y el tiempo. Estoy escuchando el evento de carga como lo indica ese artículo. –

+0

lo he intentado con 'console.log'. se registra después de que el iframe se haya cargado. – shorif2000

1

Para aquellos que usan React, detectar un evento de carga de iframe del mismo origen es tan simple como configurar onLoad detector de eventos en el elemento iframe.

<iframe src={'path-to-iframe-source'} onLoad={this.loadListener} frameBorder={0} />

1

Para cualquier persona que utilice Ember, esto debería funcionar como se esperaba:

<iframe onLoad={{action 'actionName'}} frameborder='0' src={{iframeSrc}} /> 
Cuestiones relacionadas