2009-05-29 14 views
47

Mam aplikację, która ma określoną stronę - nazwijmy ją Strona A. Strona A jest czasami stroną najwyższego poziomu, ale czasami jest osadzona jako element iframe na stronie B. Wszystkie strony są z tego samego serwera i nie ma problemów z wieloma domenami.Wykrywanie osadzania iFrame w JavaScript

Mam skrypt, który uruchamia się na stronie A. W jaki sposób skrypt skryptowy może wykryć, czy strona A znajduje się w kontekście elementu pływającego, czy nie?

+0

Czy po prostu zwrócisz uwagę rodziców na ramki i sprawdzisz, czy istnieją? – 76mel

+0

Możliwy duplikat [Jak sprawdzić, czy strona internetowa jest ładowana wewnątrz elementu iframe lub bezpośrednio w oknie przeglądarki?] (Http://stackoverflow.com/questions/326069/how-to-identify-if-a-webpage- is-being-loaded-inside-an-iframe-or-direct-into-t) – feeela

Odpowiedz

111

Patrząc na długość ramki zrywa się ogólnie, jeśli strona A sama ma ramki (wiem, że może nie być tak w przypadku tej konkretnej instancji). Im bardziej wiarygodne i sensowne badanie byłoby:

if (window!=window.top) { /* I'm in a frame! */ } 
+0

Czy możesz wyjaśnić? Czy to dlatego, że a.parent może równać się? – Cheekysoft

+5

tak, dokładnie tak - .top i .parent może wskazywać na ten sam obiekt co ja (i w rzeczywistości prawdopodobnie będzie bardziej przejrzysty do testowania window.self! = Window.top) – annakata

+0

To nie działało dla mnie w środku Rozszerzenie Firefox, ale znalazłem inne rozwiązanie: http://stackoverflow.com/questions/326069#7769187 – magnoz

11

Predykat

(window.parent.frames.length > 0) 

powie ci tylko to, co chcesz.

+0

jaka fajna strona! +1 dla tego – 76mel

+1

Po prostu nie zapomnij zrobić po: 0) –

+3

To podejście daje fałszywy alarm, jeśli zagnieżdżasz inny element iframe na stronie, na której przeprowadzasz to sprawdzanie. –

0

użytkowania window.frameElement i sprawdzić, czy nie jest null i jeśli jego nodeName jest "IFRAME".

+1

Ten element nie jest dostępny w Safari lub Opera. Biorąc pod uwagę liczbę osób korzystających obecnie z iPadów, prawdopodobnie nie jest to odpowiednie rozwiązanie. – Ash

4

Jak stwierdzono powyżej, przyjęte rozwiązanie nie działa w IE8. Ponadto sprawdzenie window.parent.frames.length może spowodować wyjątek międzydomenowy.

Zamiast tego udało mi się to osiągnąć dzięki var isInIFrame = top.location != self.location - działa w IE8 i nie powoduje naruszenia między domenami, o ile nie próbujesz odczytać zawartości top.location.

Powiązane problemy