2010-12-28 19 views
31

Tengo un widget que contiene un iframe. El usuario puede configurar la url de este iframe, pero si la url no se pudo cargar (no existe o el usuario no tiene acceso a Internet), entonces el iframe debe conmutar por error a una página predeterminada sin conexión.Detectar si el contenido del iframe se ha cargado satisfactoriamente

La pregunta es, ¿cómo puedo detectar si el iframe podría estar cargado o no? Intenté suscribirme al evento 'cargar' y, si este evento no se activa después de un tiempo, conmutaré a failover, pero esto solo funciona en Firefox, ya que IE y Chrome activan el evento 'cargar' cuando la 'Página no encontrada' es desplegado.

+0

hey skinssay, ¿encontró alguna solución sin usar un proxy? – brillout

+1

no, no lo hice. Hice una investigación más profunda y creo que no es posible :( – skinssay

+0

según http://stackoverflow.com/questions/3552355/prevent-iframe-this-webpage-is-not-available-error-from-displaying-on -website la propiedad onerror es compatible con webkit pero no tuve suerte para hacerlo funcionar. ¿Lo hiciste? – brillout

Respuesta

7

Actualmente, los navegadores tienen una serie de limitaciones de seguridad que lo mantienen alejado del contenido de un iframe (si no es de su dominio).

Si realmente necesita esa funcionalidad, debe crear una página de servidor que tenga que funcionar como un proxy, que reciba la url como parámetro, pruebe si es una url válida y redirige o muestra el error página.

0

Si tiene control sobre el contenido del iframe (por ejemplo, puede agregar código arbitrario a la página), puede intentar implementar una función especial en cada uno de ellos, luego en su página, llama a esa función y captura un error (a través del controlador window.onerror) si la función llamada a través de evalúa falla porque la página no se cargó.

Aquí es código de ejemplo: http://www.tek-tips.com/viewthread.cfm?qid=1114265&page=420

+1

dado que puso la etiqueta "dominio cruzado", me imagino que no controla ambos lados. –

+0

Sí, no tengo control sobre el contenido. La idea es que el usuario pueda configurar el src del iframe con la URL que desee. – skinssay

+0

eval es malo. iframe con eval es satánico. PHearst

0

Después de los incendios onload, puede compactar el contenido del iframe para ver si contiene una página muy útil o no. Tendría que hacer que este navegador especifique desafortunadamente porque todos muestran un mensaje diferente de "página no encontrada".

Para obtener más información, echa un vistazo aquí en http://roneiv.wordpress.com/2008/01/18/get-the-content-of-an-iframe-in-javascript-crossbrowser-solution-for-both-ie-and-firefox/

+3

Creo que esto no funcionará con el contenido de dominios cruzados. – skinssay

+0

Sí, tiene razón, no le permitirá acceder al contenido de dominios cruzados. – Bitsplitter

14

he encontrado el siguiente enlace a través de Google: http://wordpressapi.com/2010/01/28/check-iframes-loaded-completely-browser/

No sabe si se soluciona el problema 'Página no encontrada'.

<script type="javascript"> 
var iframe = document.createElement("iframe"); 
iframe.src = "http://www.your_iframe.com/"; 
if (navigator.userAgent.indexOf("MSIE") > -1 && !window.opera) { 
    iframe.onreadystatechange = function(){ 
    if (iframe.readyState == "complete"){ 
     alert("Iframe is now loaded."); 
    } 
    }; 
} else { 
    iframe.onload = function(){ 
    alert("Iframe is now loaded."); 
    }; 
} 
</script> 

No lo he probado, por lo que no sé si funciona. ¡Buena suerte!

+3

Esto funciona más o menos como el evento de carga, la condición (iframe.readyState == "complete") es verdadera incluso si la página cargada es una página de error de IE. Entonces, me avisó cuando la página se cargó, pero no si se cargó correctamente. ¡Gracias de cualquier manera! – skinssay

+0

¡Gracias! He estado buscando una solución de trabajo durante 2 horas. ¡Finalmente! :) – MikeSchinkel

+0

No funciona en Chrome: http: //stackoverflow.com/questions/13952942/iframe-readystate-does-not-work-in-chrome – anmarti

2

¿Qué tal si verificas si la URL está disponible y solo luego configuras la url real del iframe? p. con jQuery

var url = "google.com" 
var loading_url = "/empty.html" 
document.getElementById("iframe").src = loading_url; 
$.ajax({ 
    url: url, 
    type: 'GET', 
    complete: function(e, xhr, settings){ 
     if(e.status === 200){ 
       document.getElementById("iframe").src = url; 
     } 
    } 
}); 

Editar: Esto no parece funcionar varios dominios, el código de estado es 0 en esos casos.

4

Si controla el contenido del iframe, el iframe puede enviar un mensaje al padre.

 parent.postMessage('iframeIsDone', '*'); 

La devolución de llamada principal escucha el mensaje.

 var attachFuncEvent = "message"; 
     var attachFunc = window.addEventListener ; 
     if (! window.addEventListener) { 
      attachFunc = window.attachEvent; 
      attachFuncEvent = "onmessage"; 
     } 

     attachFunc(attachFuncEvent, function(event) { 
      if (event.data == 'iframeIsDone') { // iframe is done callback here 
      } 
     }); 
Cuestiones relacionadas