2012-01-18 7 views
8

Fondamentalmente ho caricato un iframe a cui si accede dal genitore ogni volta che attiva l'evento onload. Funziona bene ma sto ricevendo errori quando il contenuto dell'iframe non si trova più nello stesso dominio, come ci si può aspettare.Come rilevare se un iframe è accessibile senza generare un errore?

Unica cosa, vorrei eliminare questi errori. Sfortunatamente un try/catch non cattura questa eccezione e tentando di accedere a una di queste proprietà per convalidarle produce nuovamente lo stesso errore, vanificando così lo scopo.

Esiste un modo affidabile per controllare semplicemente se i contenuti dell'iframe sono accessibili senza generare messaggi di errore?

Grazie

Edit:

Per ragioni di contesto e non avere persone rispondono con commenti irrilevanti; Sto scrivendo un piccolo script che ridimensiona automaticamente l'iframe nella pagina padre in base all'altezza del documento iframe. Quando un utente fa clic su un collegamento all'interno dell'iframe che punta all'esterno del dominio, ovviamente non sarà in grado di rilevare l'altezza della pagina, ma preferirei non attivare alcun errore nella console e gestire l'eccezione con garbo.

Sono consapevole del fatto che esistono soluzioni alternative, sto semplicemente cercando di istruirmi scoprendo se esiste un modo elegante per gestire questo tipo di casi, piuttosto che ricorrere a una brutta soluzione alternativa.

+4

Forse è un segno che ti dice di non usare iframes ... –

+7

Seriamente? Per favore, evita di commentare se non hai nulla da contribuire. – Naatan

+0

Naatan, il tizio ti sta dando un consiglio che io faccio +1. Non è possibile avere la pagina e il frame comunicare tra loro o manipolare il contenuto dell'altro (affatto, nemmeno leggerlo) - se il loro protocollo e nome host non corrispondono alla lettera. Questo è tutto, e non ci sarà mai un modo per farlo comportarsi in modo diverso. Quello è per impedire ai malintenzionati di fare casino e rubare a gente innocente. –

risposta

5

Se è possibile aggiungere un piccolo JavaScript a tutte le pagine del dominio che si desidera caricare nell'iframe, è possibile utilizzare window.postMessage, che è esente dallo stesso criterio di origine. Probabilmente il modo più semplice sarebbe quello di fare in modo che la finestra secondaria invii un messaggio al genitore quando lo carica e lo utilizza al posto di onload. Ad esempio, è possibile aggiungere questo a ogni pagina:

if (window.parent) document.addEventListener('load', function() { 
    window.parent.postMessage("child loaded", "/"); 
}, false); 

Che vi inviare un messaggio alla finestra padre ogni volta che la pagina viene caricata in una cornice con la stessa origine. Si potrebbe quindi ascoltare in questo modo:

var iframe = document.getElementById('your-iframe'); 
var origin = window.location.protocol + '://' + window.location.host; 
if (window.location.port != 80) origin += ':' + window.location.port; 

window.addEventListener('message', function (event) { 
    if (event.source != iframe.contentWindow 
      || event.origin != origin || event.data != "child loaded") 
     return; 

    // do here what you used to do on the iframe's load event 
}, false); 

Nota che gli esempi usano il W3C/Netscape API evento e quindi non funzionerà in Internet Explorer prima della versione 9.

0

È possibile ottenere l'URL corrente di iframe utilizzando window.frames['frame_name'].contentWindow.location.href.

Se l'utente si è allontanato dal proprio dominio, non c'è modo di farlo. Scusa ...

Ulteriori informazioni here.

+0

Grazie per la risposta. So che posso farlo, ma non è questa la mia domanda.Il problema è che non riesco nemmeno a "tentare" di ottenere queste informazioni senza che il browser mi lanci degli errori di autorizzazione quando l'iframe sta servendo contenuti al di fuori del dominio dei genitori. Voglio sopprimere questi errori, in pratica come faresti con una frase try/catch, solo per qualsiasi motivo magico questi tipi di errori non vengano catturati con try/catch (almeno non in Firefox). – Naatan

+0

Non penso che ci sia un modo per sopprimere questo tipo di errori del browser. È lo stesso con 404 richieste AJAX. – Jivings

+0

@Naatan: nel peggiore dei casi, è possibile pianificare un 'setTimeout' in 0 ms per risolvere il problema. – Hello71

0

Non riesci ad accedere all'attributo src dal genitore?

A quanto ho capito, l'elemento iframe appartiene alla pagina "padre", mentre l'oggetto window contenuto con l'iframe appartiene alla pagina "figlio".

questo funziona per me:

<html> 
<head> 
</head> 
<body> 
<iframe id="ifr" name="ifr" src="http://www.example.com"></iframe> 
<input type="button" onclick="showSrc()" value="showSrc" /> 
<input type="button" onclick="showHref()" value="showHref" /> 
<script> 
    var ifr = document.getElementById('ifr'); 
    function showSrc() { 
     // no warning 
     alert(ifr.src); 
    } 
    function showHref() { 
     // warning 
     alert(window.frames['ifr'].contentWindow.location.href); 
    } 

</script> 
</body> 
</html> 
+0

Posso, il problema è comunque che si possono cliccare i collegamenti all'interno dell'iframe, che non cambierebbe l'attributo src sul genitore. – Naatan

+0

@Naatan Accidenti. Giusto. Quindi non penso che ci sia comunque da fare senza un errore sollevato. – Tim

+0

Grazie Tim, temo che tu possa avere ragione. – Naatan

0

Ok questo è eccessivo, non è molto, ma un hack e forse non è possibile nella vostra situazione, ma in ogni caso:

si potrebbe aggiungere un inserimento javascript in tutte le pagine dal tuo sito che tenta di accedere all'apertore (il frame principale) e impostare un flag (una variabile come bool stillOnMySite) su true.

Poi

  1. Tempo base: Lo script nelle pagine del sito imposta il flag ogni secondo su true, lo script nella vostra iframe genitore imposta il flag ogni secondo per falso. Sondare l'iframe in un setTimeOut (xxx, 1). Se il flag non è di nuovo true, l'utente ha lasciato il tuo sito e non è necessario eseguire il polling dell'iframe se il flag è true, l'utente è ancora sul tuo sito web è possibile eseguire il polling dell'iframe.

  2. Clicca base: utilizzando jQuery per javascript discreto, lo script nelle pagine del sito web monitora clickevents in tutti i link nella pagina.Se un link sta andando fuori dal tuo dominio, questo imposta il flag nell'iframe principale su false.

Ovviamente questa teoria si sbriciola se non è possibile aggiungere script nelle pagine del proprio sito Web.

In alternativa, ho pensato: se il tuo iframe inizia sempre sul tuo sito web, non è necessario modificare le pagine del tuo sito web, semplicemente immetti la n ° 2 soluzione dall'iframe padre nella pagina iframed.

+0

Un approccio interessante, e potrebbe valere la pena di ricorrere a questo, anche se mi sarebbe piaciuto sviluppare lo script in questione senza dipendenze. – Naatan

+0

Utilizzando lo scenario alternativo, ovvero se l'iframe viene sempre avviato sul sito Web, è possibile iniettare il monitor onclick su ogni collegamento della pagina iframe dal genitore iframe. jQuery lo rende estremamente facile, ma puoi farlo anche in javascript. In bocca al lupo ! – Yahel

0

Potrebbe dirmi come si impostare lo src dell'iframe?
se si usa javascript per cambiarlo dinamicamente, il problema è facile da gestire.

var isXdm = false; 
function setSrc(id,src){ 
    //detect whether src is cross domain then set the variable isXdm 
    ... 
} 

anche così, non credo che sia un buon modo per risolvere questo problema.
spero che qualcuno possa trovare una soluzione migliore.

+0

Ciao Simon, il problema non è con l'attributo src, mi rendo conto di poterlo facilmente leggere. Riguarda il percorso di modifica dell'iframe una volta caricato (ad esempio quando un utente fa clic su un collegamento nella pagina caricata). – Naatan

0

Come non rendere IFRAME affatto (all'interno della pagina padre) se il suo href non punta allo stesso protocollo e host della pagina padre? Probabilmente fraintendo le cose relative al fatto che possiedi entrambi i siti, o solo uno di loro (e quale). Ma se possiedi il sito della pagina padre, dovresti essere in grado di farlo, sia sul server (prima che IFRAME sia incluso), o in qualche punto sul client (caricamento della pagina/caricamento doc).

+0

Hey Hari, il problema che sto avendo non è con il src originale che viene caricato, ma piuttosto con persone che cliccano link nell'iframe caricato che punta fuori dal dominio. Penso che dovrò ricorrere a una soluzione alternativa però. – Naatan

+0

Hm, fare clic sui collegamenti all'interno di un IFRAME non dovrebbe comportare tale comportamento; dovrebbe funzionare allo stesso modo come se avessi aperto quella pagina con cornice nella finestra in alto. Stai provando a parlare con IFRAME (o manipolare il suo contenuto), o IFRAME ha il codice che fa riferimento alla finestra in alto. Ho iniziato a percepire i segreti nella tua domanda ... –

1

Prova questo:

var $frame = $("#frameId"); // swap with the id of the iframe 
try { 
    var canAccess = $frame.contents(); 
    if(!!canAccess) { 
     // same domain yay you have access 
     // do your thing here 
    } 
} 
catch(e) { 
    // bummer can't do much with it 
    return false; 
} 

EDIT: aggiungere un try e catch, nessun errore tornerà falso.

+0

In entrambi i casi si attiva la stessa istruzione IF (iframe accessibile o non accessibile). Stranamente non c'è nessun errore di sicurezza, mi chiedo se stai facendo qualcosa qui .. – Naatan

+0

Questo ha funzionato bene per me. Trigger per domini interni, ignora i domini esterni. Nessun errore –

Problemi correlati