Cum de a identifica dacă o pagină web este încărcat în interiorul unui iFrame sau direct în fereastra browser-ului?

voturi
450

I-am scris o aplicație Facebook bazate pe iframe. Acum vreau să folosesc aceeași pagină HTML pentru a face site-ul normal și pagina panza în termen de facebook. Vreau să știu dacă pot stabili dacă pagina a fost încărcată în interiorul iframe sau direct în browser?

Întrebat 28/11/2008 la 16:45
sursa de către utilizator
În alte limbi...                            


15 răspunsuri

voturi
840

Browserele pot bloca accesul la din window.topcauza la politica de aceeași origine . Bug - uri IE , de asemenea , să ia loc. Iată codul de lucru:

function inIframe () {
    try {
        return window.self !== window.top;
    } catch (e) {
        return true;
    }
}

topși selfsunt ambele windowobiecte (alături parent), astfel încât să vedeți dacă fereastra este fereastra de sus.

Publicat 28/11/2008 la 16:47
sursa de către utilizator

voturi
25

RoBorg este corectă, dar am vrut să adaug o notă laterală.

În IE7 / IE8 atunci când Microsoft a adăugat File pentru browser-ul lor au rupt un lucru care va face ravagii cu JS dacă nu ești atent.

Imaginați-vă acest aspect pagină:

MainPage.html
  IframedPage1.html   (named "foo")
  IframedPage2.html   (named "bar")
    IframedPage3.html (named "baz")

Acum, în cadru „Baz“, faceți clic pe un link (fără țintă, sarcini în „Baz“ cadru) funcționează bine.

Dacă pagina care se încarcă, vă permite să numesc special.html, foloseste JS pentru a verifica dacă „acesta“ are un cadru părinte numit „bar“ se va întoarce true (de așteptat).

Acum, vă permite să spun că pagina special.html când se încarcă, verifică cadrul părinte (pentru existența și numele, și dacă este „bar“, ea se reîncarcă în cadrul bara de ex.

if(window.parent && window.parent.name == 'bar'){
  window.parent.location = self.location;
}

Până acum, bine. Acum vine bug-ul.

Să spunem în loc să faceți clic pe link-ul original, cum ar fi normal, și la încărcarea paginii special.html în „Baz“ râmă, mijloc-a făcut clic sau a ales să-l deschidă într-o filă nouă.

În cazul în care noi sarcini filă ( fără cadre părinte la toate! ) IE va introduce o buclă fără sfârșit de încărcare a paginii! deoarece IE „copii peste“ structura cadrului în JavaScript astfel încât noua filă are un părinte, și că mama are numele de „bar“.

Vestea bună este că verificarea:

if(self == top){
  //this returns true!
}

în această nouă filă se întoarce adevărat, și, astfel, puteți testa pentru această afecțiune ciudată.

Publicat 28/11/2008 la 18:53
sursa de către utilizator

voturi
1

Din moment ce se cere în contextul unei aplicații Facebook, ați putea dori să ia în considerare acest lucru la detectarea server atunci când se face cererea inițială. Facebook va trece de-a lungul o grămadă de querystring de date, inclusiv cheia fb_sig_user în cazul în care este numit de la un iframe.

Din moment ce, probabil, trebuie să verificați și să utilizeze aceste date oricum în aplicația dvs., utilizați pentru a determina contextul adecvat pentru a face.

Publicat 11/12/2008 la 23:04
sursa de către utilizator

voturi
2

Utilizați această funcție javascript ca un exemplu cu privire la modul de a realiza acest lucru.

function isNoIframeOrIframeInMyHost() {
// Validation: it must be loaded as the top page, or if it is loaded in an iframe 
// then it must be embedded in my own domain.
// Info: IF top.location.href is not accessible THEN it is embedded in an iframe 
// and the domains are different.
var myresult = true;
try {
    var tophref = top.location.href;
    var tophostname = top.location.hostname.toString();
    var myhref = location.href;
    if (tophref === myhref) {
        myresult = true;
    } else if (tophostname !== "www.yourdomain.com") {
        myresult = false;
    }
} catch (error) { 
  // error is a permission error that top.location.href is not accessible 
  // (which means parent domain <> iframe domain)!
    myresult = false;
}
return myresult;
}
Publicat 21/09/2011 la 03:32
sursa de către utilizator

voturi
16

Răspunsul acceptat nu a funcționat pentru mine în interiorul script-ul de conținut al unui Firefox 6.0 Extension (Addon-SDK 1.0): Firefox execută scriptul de conținut în fiecare: fereastra de nivel superior și în toate iframe.

În interiorul script-ul de conținut am obține următoarele rezultate:

 (window !== window.top) : false 
 (window.self !== window.top) : true

Lucru ciudat despre această ieșire este că este întotdeauna același, indiferent dacă codul se execută în cadrul unui iframe sau fereastra de nivel superior.

Pe de altă parte, Google Chrome pare să execute script-ul meu de conținut doar o singură dată în cadrul ferestrei de nivel superior, astfel încât cele de mai sus nu va funcționa deloc.

Ceea ce în cele din urmă a lucrat pentru mine într-un script de conținut în ambele browsere este aceasta:

 console.log(window.frames.length + ':' + parent.frames.length);

Fără a iframe această imprimeuri 0:0, într - o fereastră de nivel superior care conține un singur cadru se imprimă 1:1, iar în numai iframe unui document se imprimă 0:1.

Acest lucru permite extensia mea pentru a determina în ambele browsere dacă există iframe prezente, și în plus, în Firefox în cazul în care se execută în interiorul unuia dintre IFrames.

Publicat 14/10/2011 la 15:32
sursa de către utilizator

voturi
-1

Este o piesă veche de cod pe care l-am folosit de câteva ori:

if (parent.location.href == self.location.href) {
    window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
Publicat 25/10/2011 la 04:57
sursa de către utilizator

voturi
5

Folosesc acest lucru:

var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
Publicat 20/06/2012 la 11:04
sursa de către utilizator

voturi
-3
if (window.frames.length != parent.frames.length) { page loaded in iframe }

Dar numai dacă numărul de cadre iframe diferă în pagina și pagina care vă încărcați în iframe. A face nici o iframe în pagina dvs. de a avea o garanție de 100% din rezultatul acestui cod

Publicat 27/10/2012 la 16:31
sursa de către utilizator

voturi
-4

Scrie acest cod JavaScript în fiecare pagină

if (self == top)
  { window.location = "Home.aspx"; }

Apoi, acesta va redirecționează automat la pagina de start.

Publicat 08/02/2013 la 07:15
sursa de către utilizator

voturi
0

Dacă doriți să știți dacă utilizatorul accesează aplicația din fila pagina de Facebook sau cec panza pentru cerere semnata. Dacă nu-l lua, probabil, utilizatorul nu accesează de la Facebook. Pentru a vă asigura confirmă structura signed_request câmpuri și câmpuri de conținut.

Cu php-SDK-ul puteți obține cerere semnată de genul:

$signed_request = $facebook->getSignedRequest();

Puteți citi mai multe despre cerere semnata aici:

https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/

si aici:

https://developers.facebook.com/docs/reference/login/signed-request/

Publicat 17/06/2013 la 19:08
sursa de către utilizator

voturi
64

window.frameElementReturnează elementul (cum ar fi <iframe> sau <obiect>) în care este încorporat în fereastră sau nulă în cazul în care fereastra este de nivel superior. Deci, codul de identificare arată

if (window.frameElement) {
  // in frame
}
else {
  // not in frame
}

Acest lucru este standard și mai degrabă nouă metodă. Acesta funcționează exact în Chrome și Firefox. Nu pot recomanda ca soluție universală , dar trebuie menționat aici , cred.

Publicat 07/09/2013 la 23:55
sursa de către utilizator

voturi
1

de fapt, am folosit pentru a verifica window.parent și a lucrat pentru mine, dar in ultimul timp fereastra este un obiect ciclic și întotdeauna are o cheie părinte, iframe sau nu iframe.

După cum sugerează comentariile greu de comparat cu lucrări window.parent. Nu sunt sigur dacă acest lucru va funcționa dacă iframe este exact aceeași pagină web ca părinte.

window === window.parent;
Publicat 04/03/2014 la 04:47
sursa de către utilizator

voturi
3

Nu sunt sigur cum funcționează acest exemplu pentru browsere web mai vechi, dar am folosi acest lucru pentru IE, Firefox și Chrome și fără problemă:

var iFrameDetection = (window === window.parent) ? false : true;
Publicat 19/11/2015 la 09:30
sursa de către utilizator

voturi
0

Cel mai bun-pentru-acum Frame Legacy Browser Breaking Script

Celelalte soluții nu au lucrat pentru mine. Acesta funcționează pe toate browserele:

O modalitate de a-și apăra împotriva clickjacking este de a include un „cadru-breaker“ script în fiecare pagină care nu ar trebui să fie încadrată. Metodologia următoare va preveni o pagină web de a fi incadrat chiar si in browsere mai vechi, care nu acceptă X-Frame-Options-antet.

În elementul HEAD documentului, adăugați următoarele:

<style id="antiClickjack">body{display:none !important;}</style>

Mai întâi se aplică un ID la elementul de stil în sine:

<script type="text/javascript">
   if (self === top) {
       var antiClickjack = document.getElementById("antiClickjack");
       antiClickjack.parentNode.removeChild(antiClickjack);
   } else {
       top.location = self.location;
   }
</script>

În acest fel, totul poate fi în antetul documentului și aveți nevoie doar de o singură metodă / taglib în API-ul dumneavoastră.

Referință: https://www.codemagi.com/blog/post/194

Publicat 12/04/2018 la 09:24
sursa de către utilizator

voturi
0

Aceasta a pus capăt fiind cea mai simplă soluție pentru mine.

    <p id="demofsdfsdfs"></p>

<script>

if(window.self !== window.top) {

//run this code if in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "in frame";

}else{

//run code if not in an iframe
document.getElementById("demofsdfsdfs").innerHTML = "no frame";
}

</script>
Publicat 25/07/2018 la 01:15
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more