2009-05-29 3 views
47

У меня есть приложение, которое имеет определенную страницу - назовем его Page A. Страница A иногда является страницей верхнего уровня, но также иногда внедряется как iframe внутри страницы B. Все страницы приходят с того же сервера, и нет проблем с междоменным доступом.Обнаруживать встраивание iFrame в Javascript

У меня есть сценарий greasemonkey, который работает на странице A. Как скрипт greasemonkey обнаруживает, находится ли страница A в контексте iframe или нет?

+0

Вы бы просто искали родителя для фреймов и посмотреть, существуют ли они? – 76mel

+0

Возможный дубликат [Как определить, загружается ли веб-страница внутри iframe или непосредственно в окне браузера?] (Http://stackoverflow.com/questions/326069/how-to-identify-if-a-webpage- is-being-loaded-inside-an-iframe-or-direct-in-t) – feeela

ответ

111

Глядя на длину кадра, ломается вообще, если сама страница А имеет фреймы (я знаю, что это может быть не для конкретного экземпляра). Более надежное и значимое испытание было бы:

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

Можете ли вы объяснить? Это потому, что a.parent может равняться? – Cheekysoft

+5

да, именно так - .top и .parent могут указывать на тот же объект, что и сам (и на самом деле, возможно, было бы лучше проверить окно .self! = Window.top) – annakata

+0

Это не сработало для меня внутри Firefox, но я нашел другое решение: http://stackoverflow.com/questions/326069#7769187 – magnoz

11

Предикат

(window.parent.frames.length > 0) 

покажет вам только то, что вы хотите.

+0

какой классный сайт! +1 для этого – 76mel

+1

Просто не забудьте сделать это после: 0) –

+3

Этот подход дает вам ложное срабатывание, если вы гнездите другой iframe на странице, на которой вы выполняете эту проверку. –

0

Использования window.frameElement и проверить, если он не пуст, и если его NODENAME является «IFRAME».

+1

Этот элемент недоступен в Safari или Opera. Учитывая количество людей, посещающих iPads в наши дни, это, вероятно, не подходит. – Ash

4

Как указано выше, принятое решение не работает в IE8. Кроме того, проверка window.parent.frames.length может вызвать исключение междоменной области.

Вместо этого я смог достичь этого с помощью var isInIFrame = top.location != self.location - он работает в IE8 и не вызывает нарушения междоменной зоны, если вы не пытаетесь прочитать содержимое top.location.

Смежные вопросы