2010-12-28 40 views
31

Ho un widget che contiene un iframe. L'utente può configurare l'url di questo iframe, ma se l'url non può essere caricato (non esiste o l'utente non ha accesso a internet) allora l'iframe dovrebbe eseguire il failover su una pagina offline predefinita.Rileva se il contenuto dell'iframe è stato caricato con successo

la domanda è: come posso rilevare se l'iframe potrebbe essere caricato o no? Ho provato ad iscrivermi all'evento "load" e, se questo evento non viene attivato dopo un po 'di tempo, eseguo il failover, ma funziona solo in Firefox, poiché IE e Chrome attivano l'evento "load" quando "Page Not Found" è visualizzato.

+0

hey skinssay, hai trovato qualche soluzione senza utilizzare un proxy? – brillout

+1

no, non l'ho fatto. Ho fatto una ricerca più approfondita e penso che non sia possibile :( – skinssay

+0

secondo http://stackoverflow.com/questions/3552355/prevent-iframe-this-webpage-is-not-available-error-from-displaying-on -website la proprietà onerror è supportata dal webkit ma non ho avuto fortuna di farlo funzionare. hai fatto? – brillout

risposta

7

Al giorno d'oggi i browser hanno una serie di limitazioni di sicurezza che tenere lontano dal contenuto di un iframe (se purtroppo non si del dominio).

Se avete veramente bisogno questa funzionalità, è necessario costruire una pagina di server che devono lavorare come un proxy, che ricevono l'URL come un parametro, test se si tratta di un URL valido, e fa il reindirizzamento o visualizzare l'errore pagina.

0

Se si ha il controllo del contenuto dell'iframe (ad esempio è possibile aggiungere un codice arbitrario alla pagina), è possibile provare a implementare una funzione speciale in ciascuno di essi, quindi nella propria pagina, si chiama tale funzione e si cattura un errore (tramite il gestore window.onerror) se la funzione chiamata tramite eval non riesce perché la pagina non è stata caricata.

Ecco codice di esempio: http://www.tek-tips.com/viewthread.cfm?qid=1114265&page=420

+1

da quando ha inserito il tag "cross-domain", immagino che non controlli entrambi i lati. –

+0

Sì, non ho il controllo sul contenuto. L'idea è che l'utente possa configurare lo src dell'iframe con qualunque URL desideri. – skinssay

+0

eval è il male. l'iframe con eval è satanico. PHearst

0

Dopo i fuochi onload, è possibile pulire il contenuto del iframe per vedere se contiene una pagina utile o meno. Dovresti rendere sfortunatamente questo browser specifuc perché visualizzano tutti un messaggio diverso "pagina non trovata".

Per maggiori informazioni, date un'occhiata qui a http://roneiv.wordpress.com/2008/01/18/get-the-content-of-an-iframe-in-javascript-crossbrowser-solution-for-both-ie-and-firefox/

+3

Penso che questo non funzionerà con i contenuti interdominio. – skinssay

+0

Sì, hai ragione, non ti consente di accedere al contenuto interdominio. – Bitsplitter

14

ho trovato il seguente link via Google: http://wordpressapi.com/2010/01/28/check-iframes-loaded-completely-browser/

Non so se si risolve il problema 'Pagina non trovata'.

<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> 

Non l'ho provato da solo, quindi non so se funziona. In bocca al lupo!

+3

Funziona come l'evento onload, la condizione (iframe.readyState == "complete") è vera anche se la pagina caricata è una pagina di errore IE. Quindi, fammi sapere quando la pagina è stata caricata, ma non se è stata caricata correttamente. Grazie comunque! – skinssay

+0

Grazie! Ho setacciato per una soluzione di lavoro per 2 ore. Finalmente! :) – MikeSchinkel

+0

Non funziona in Chrome: http: //stackoverflow.com/questions/13952942/iframe-readystate-does-not-work-in-chrome – anmarti

2

Come circa il controllo Se l'URL è disponibile e solo allora impostando l'URL effettivo del iframe? ad es. 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; 
     } 
    } 
}); 

Edit: Questo non sembra funzionare dominio croce, il codice di stato è 0 in questi casi.

4

Se controlli il contenuto del iframe, l'iframe può inviare un messaggio al genitore.

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

La richiamata genitore ascolta il messaggio.

 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 
      } 
     }); 
Problemi correlati