Jak zjistit, zda webová stránka se načítá uvnitř iframe nebo přímo do okna prohlížeče?

hlasů
450

Píši o iframe založený Facebook aplikací. Teď chci použít stejný html stránku k tomu, normální webové stránky, stejně jako strana plátna uvnitř facebooku. Chci vědět, jestli můžu zjistit, zda stránka byla vložena uvnitř iframe nebo přímo v prohlížeči?

Položena 28/11/2008 v 16:45
zdroj uživatelem
V jiných jazycích...                            


15 odpovědí

hlasů
840

Prohlížeče mohou blokovat přístup k window.topvzhledem k téže politiky původu . IE chyby také konat. Zde je pracovní kód:

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

topa selfjsou oba windowobjekty (spolu s parent), takže vidíte, pokud vaše okna je horní okno.

Odpovězeno 28/11/2008 v 16:47
zdroj uživatelem

hlasů
25

RoBorg je správná, ale chtěl jsem se přidat boční poznámku.

V IE7 / IE8, kdy Microsoft přidal záložky do svého prohlížeče rozbili jednu věc, která způsobí zmatek s vaší JS, pokud si nejste opatrní.

Představte si tuto stránku rozvržení:

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

Nyní v rámu „Baz“ klepnutí na odkaz (žádný cíl nákladů v „BAZ“ rámu) funguje to v pohodě.

V případě, že strana, která se nahraje, nechává říkat special.html, používá JS zjistit, jestli „to“ má nadřazený snímek s názvem „bar“ vrátí true (očekávané).

Nyní řekněme, že strana special.html když se načte, zkontroluje nadřazený rám (pro existenci a svým jménem, ​​a pokud je „bar“ znovu načte sám v baru rámu. Např

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

Zatím je vše dobré. Nyní přichází chyba.

Řekněme namísto klepnutí na původní linku jako normální, a načítání stránky special.html v „Baz“ rámu, vy middle-klikli, nebo se rozhodli ji otevře v novém panelu.

Když že nová karta zatížení ( s žádnými mateřskými rámy vůbec! ) IE vstoupí do nekonečné smyčky načítání stránky! protože IE „kopíruje přes“ rámové konstrukce v JavaScriptu, takže nová karta má mít rodiče a že rodič má název „bar“.

Dobrou zprávou je, že kontrola:

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

V tomto novém panelu se vrátí true, a tak si můžete vyzkoušet v tomto podivném stavu.

Odpovězeno 28/11/2008 v 18:53
zdroj uživatelem

hlasů
1

Vzhledem k tomu, žádáte v souvislosti s aplikací Facebook, možná budete chtít, aby zvážila odhalování to na server, když je počáteční žádost podána. Facebook bude předat spoustu QueryString dat včetně klíče fb_sig_user pokud to je voláno z iframe.

Vzhledem k tomu, pravděpodobně budete muset zkontrolovat a tato data použít v každém případě ve vaší aplikaci, použijte ji určit příslušný kontext k vykreslení.

Odpovězeno 11/12/2008 v 23:04
zdroj uživatelem

hlasů
2

To JavaScript funkci použít jako příklad o tom, jak toho dosáhnout.

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;
}
Odpovězeno 21/09/2011 v 03:32
zdroj uživatelem

hlasů
16

Akceptovanou odpověď nepracoval pro mě uvnitř skript obsahu jednoho Firefox 6.0 Extension (Addon-SDK 1.0): Firefox spustí skript obsahu v každém: okno nejvyšší úrovně a ve všech iframe.

Uvnitř skript obsahu dostanu následující výsledky:

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

Podivná věc na tomto výstupu je to, že je to vždy stejné bez ohledu na to, zda je kód běží uvnitř iframe nebo okno nejvyšší úrovně.

Na druhou stranu se zdá Google Chrome spustit svůj obsah skriptu pouze jednou v okně nejvyšší úrovně, takže výše uvedené nebude fungovat vůbec.

To, co nakonec pracoval pro mě v skript obsahu v obou prohlížečích, je toto:

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

Bez iframe Vytiskne 0:0, v okně nejvyšší úrovně, který obsahuje jeden snímek se vytiskne 1:1a v jediném iframe dokumentu tiskne 0:1.

To umožňuje moje rozšíření určit v obou prohlížečích, zda existují nějaké jezdci přítomen, a navíc ve Firefoxu, pokud je spuštěn v jednom z iframe.

Odpovězeno 14/10/2011 v 15:32
zdroj uživatelem

hlasů
-1

Je to prastarý kus kódu, který jsem použil několikrát:

if (parent.location.href == self.location.href) {
    window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
Odpovězeno 25/10/2011 v 04:57
zdroj uživatelem

hlasů
5

Já používám toto:

var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
Odpovězeno 20/06/2012 v 11:04
zdroj uživatelem

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

Ale pouze tehdy, pokud počet iframe se liší ve své stránky a stránky, které vás načítání iframe. Nečiníme iframe do stránky mají 100% záruku Výsledkem tohoto kódu

Odpovězeno 27/10/2012 v 16:31
zdroj uživatelem

hlasů
-4

Psát tento javascript na každé stránce

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

Poté se automaticky přesměruje na domovskou stránku.

Odpovězeno 08/02/2013 v 07:15
zdroj uživatelem

hlasů
0

Chcete-li zjistit, zda je uživatel přístup k aplikaci na kartě stránku na Facebooku nebo šekem plátno pro podepsané žádosti. Pokud nechcete dostat to, pravděpodobně není uživatel přístup z Facebooku. Aby se ujistil, potvrzují signed_request pole strukturu a pole obsahu.

S PHP-SDK můžete získat podepsané žádosti takto:

$signed_request = $facebook->getSignedRequest();

Můžete si přečíst více o podepsané žádosti zde:

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

a tady:

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

Odpovězeno 17/06/2013 v 19:08
zdroj uživatelem

hlasů
64

window.frameElementVrací prvek (jako je například <iframe> nebo <objekt>), ve které je okno vložený nebo null, pokud je okno nejvyšší úrovně. Takže identifikační kód vypadá

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

To je standardní a poměrně nová metoda. Je to přesně funguje v Chrome a Firefox. Nemohu doporučit jako univerzální řešení, ale je třeba zmínit myslím.

Odpovězeno 07/09/2013 v 23:55
zdroj uživatelem

hlasů
1

Já vlastně používají ke kontrole window.parent a fungovalo to pro mě, ale v poslední době okno je cyklická objekt a má vždy nadřazený klíč, iframe nebo ne iframe.

Vzhledem k tomu, komentáře naznačují, těžké ve srovnání s window.parent prací. Není si jistý, jestli to bude fungovat, pokud iframe je přesně stejné webové stránky jako rodič.

window === window.parent;
Odpovězeno 04/03/2014 v 04:47
zdroj uživatelem

hlasů
3

Nejsem si jistý, jak tento příklad funguje u starších prohlížečích, ale já používám to pro IE, Firefox a Chrome, aniž by a vydání:

var iFrameDetection = (window === window.parent) ? false : true;
Odpovězeno 19/11/2015 v 09:30
zdroj uživatelem

hlasů
0

Nejlepší-for-dosud Legacy Browser Frame Breaking Script

Ostatní řešení neměl pracoval pro mě. Ten funguje ve všech prohlížečích:

Jeden způsob, jak se bránit proti CLICKJACKING je zahrnout „frame-breaker“ skript na každou stránku, která by neměla být orámovaný. Následující metodika bude zabránit webové stránky z bytí orámovaný i ve starších prohlížečích, které nepodporují X-Frame-Options-header.

V dokumentu prvku HEAD, přidejte následující:

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

První aplikovat ID stylu samotného prvku:

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

Tímto způsobem vše, co může být v záhlaví dokumentu a budete potřebovat pouze jednu metodu / taglib v API.

Reference: https://www.codemagi.com/blog/post/194

Odpovězeno 12/04/2018 v 09:24
zdroj uživatelem

hlasů
0

To skončilo, že nejjednodušší řešení pro mě.

    <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>
Odpovězeno 25/07/2018 v 01:15
zdroj uživatelem

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