Estamos utilizando jQuery thickbox para mostrar dinámicamente un iframe cuando alguien hace clic en una imagen. En este iframe, estamos utilizando galleria, una biblioteca de JavaScript para mostrar varias imágenes.
El problema parece ser que $(document).ready
en el iframe parece dispararse demasiado pronto y el contenido del iframe ni siquiera está cargado, por lo que el código de galería no se aplica correctamente en los elementos DOM. $(document).ready
parece usar el estado de padre preparado de iframe para decidir si el iframe está listo.
Si extraemos la función llamada por documento listo en una función separada y la llamamos después de un tiempo de espera de 100 ms. Funciona, pero no podemos arriesgarnos en la producción con una computadora lenta.
$(document).ready(function() { setTimeout(ApplyGalleria, 100); });
Mi pregunta: ¿a qué evento jQuery deberíamos unirnos para poder ejecutar nuestro código cuando el iframe dinámico está listo y no solo es un padre?
Respuestas:
Respondí una pregunta similar (ver devolución de llamada de Javascript cuando IFRAME ha terminado de cargarse ). Puede obtener control sobre el evento de carga de iframe con el siguiente código:
Al tratar con iframes, encontré lo suficientemente bueno como para usar el evento de carga en lugar del evento de documento listo.
fuente
.load()
El evento está en desuso. Usar en su.on( "load", handler )
lugar.Usando jQuery 1.3.2, lo siguiente funcionó para mí:
REVISIÓN:! En realidad, el código anterior a veces parece funcionar en Firefox, nunca parece funcionar en Opera.
En cambio, implementé una solución de sondeo para mis propósitos. Simplificado hacia abajo se ve así:
Esto no requiere código en las páginas de iframe llamadas. Todo el código reside y se ejecuta desde el marco / ventana principal.
fuente
setInterval
para votar en su lugar.En IFrames, generalmente resuelvo este problema colocando un pequeño script al final del bloque:
Esto funciona la mayor parte del tiempo para mí. A veces, la solución más simple e ingenua es la más adecuada.
fuente
parent
para obtener una copia de jQuery y usarloparent.$(document).ready(function(){ parent.IFrameLoaded( ); });
para inicializar el iframe.Siguiendo la idea de DrJokepu y David Murdoch, implementé una versión más completa. Se requiere jQuery en tanto el padre como marco flotante y el iframe para estar en su control.
código de iframe:
código de prueba de los padres:
fuente
Encontró la solución al problema.
Cuando hace clic en un enlace de caja gruesa que abre un iframe, inserta un iframe con una identificación de TB_iframeContent.
En lugar de confiar en el
$(document).ready
evento en el código del iframe, solo tengo que vincularme al evento de carga del iframe en el documento principal:Este código está en el iframe pero se une a un evento de un control en el documento principal. Funciona en Firefox e IE.
fuente
top.document
que me permite tener el código dentro del iframe para saber cuándo se ha cargado el iframe. (Aunqueload
ha quedado en desuso desde esta respuesta, y debe reemplazarse poron("load")
).Básicamente lo que otros ya han publicado, pero en mi humilde opinión, es un poco más limpio:
fuente
Prueba esto,
Todo lo que necesita hacer es crear la función JavaScript testframe_loaded ().
fuente
Estoy cargando el PDF con jQuery ajax en la memoria caché del navegador. Luego creo un elemento incrustado con datos que ya están en la memoria caché del navegador. Supongo que también funcionará con iframe.
También debe configurar sus encabezados http correctamente.
fuente
Este fue el problema exacto con el que me encontré con nuestro cliente. Creé un pequeño complemento jquery que parece funcionar para la preparación de iframe. Utiliza el sondeo para verificar el documento iframe readyState combinado con la url interna del documento combinada con la fuente del iframe para asegurarse de que el iframe esté "listo".
El problema con "onload" es que necesita acceso al iframe real que se agrega al DOM; si no lo hace, debe intentar atrapar la carga del iframe, que si está en caché, entonces no puede. Lo que necesitaba era un script que pudiera llamarse en cualquier momento, y determinar si el iframe estaba "listo" o no.
Aquí está la pregunta:
Santo Grial para determinar si el iframe local se ha cargado o no
y aquí está el jsfiddle que eventualmente se me ocurrió.
https://jsfiddle.net/q0smjkh5/10/
En el jsfiddle anterior, estoy esperando que onload agregue un iframe al dom, luego verifico el estado listo del documento interno del iframe, que debería ser dominio cruzado porque apunta a wikipedia, pero Chrome parece informar "completo". El método iready del complemento se llama cuando el iframe está listo. La devolución de llamada intenta verificar el estado listo del documento interno nuevamente, esta vez informando una solicitud de dominio cruzado (que es correcta), de todos modos parece funcionar para lo que necesito y espero que ayude a otros.
fuente
Esta función de esta respuesta es la mejor manera de manejar esto, ya que
$.ready
explícitamente falla para iframes. Aquí está la decisión de no apoyar esto.El
load
evento tampoco se activa si el iframe ya se ha cargado. ¡Muy frustrante que esto siga siendo un problema en 2020!}
fuente