Это один лайнер с lodash.
const deep = { l1: { l2: { l3: "Hello" } } };
const prop = "l1.l2.l3";
const val = _.reduce(prop.split('.'), function(result, value) { return result ? result[value] : undefined; }, deep);
// val === "Hello"
Или даже лучше ...
const val = _.get(deep, prop);
Или версия ES6 с уменьшением ...
const val = prop.split('.').reduce((r, val) => { return r ? r[val] : undefined; }, deep);
Браузеры могут заблокировать доступ к window.top
из-за политики того же происхождения . Ошибки IE также имеют место. Вот рабочий код:
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
top
и self
- оба объекта window
(вместе с parent
), поэтому вы видите, что ваше окно является верхним окном.
Другие решения не сработали для меня. Это работает во всех браузерах:
. Один из способов защитить от clickjacking - включить скрипт «frame-breaker» на каждой странице, который не должен быть обрамлен. Следующая методология предотвратит создание веб-страницы даже в старых браузерах, которые не поддерживают X-Frame-Options-Header.
В элементе HEAD документа добавьте следующее:
<style id="antiClickjack">body{display:none !important;}</style>
Сначала примените идентификатор к самому стилю:
<script type="text/javascript">
if (self === top) {
var antiClickjack = document.getElementById("antiClickjack");
antiClickjack.parentNode.removeChild(antiClickjack);
} else {
top.location = self.location;
}
</script>
Таким образом, все может быть в документе HEAD, и вам нужен только один метод / taglib в вашем API.
Это закончилось как самое простое решение для меня.
<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>
Напишите этот javascript на каждой странице
if (self == top)
{ window.location = "Home.aspx"; }
Затем он автоматически перенаправляется на домашнюю страницу.
Я не уверен, как этот пример работает для старых веб-браузеров, но я использую это для IE, Firefox и Chrome без проблем:
var iFrameDetection = (window === window.parent) ? false : true;
Я использую это:
var isIframe = (self.frameElement && (self.frameElement+"").indexOf("HTMLIFrameElement") > -1);
Это древний фрагмент кода, который я использовал несколько раз:
if (parent.location.href == self.location.href) {
window.location.href = 'https://www.facebook.com/pagename?v=app_1357902468';
}
(parent.location == self.location)
– piotr_cz
20 August 2013 в 13:21
parent.location
. В противном случае исключается исключение
– Dan
13 January 2014 в 12:50
Поскольку вы спрашиваете в контексте приложения facebook, возможно, вам стоит подумать об обнаружении этого на сервере при первоначальном запросе. Facebook будет передавать кучу данных запроса, включая ключ fb_sig_user, если он вызывается из iframe.
Поскольку вам, вероятно, нужно все равно проверять и использовать эти данные в своем приложении, используйте его, чтобы определить подходящий контекст для рендеринга.
Я действительно использовал для проверки window.parent, и это сработало для меня, но в последнее время окно является циклическим объектом и всегда имеет родительский ключ, iframe или no iframe.
Поскольку комментарии показывают, что трудно сравнивать с window.parent работает. Не уверен, что это будет работать, если iframe является точно такой же веб-страницей, что и родительский.
window === window.parent;
window.parent === window
истинно. Поэтому ваш ответ неверен. И этот сопоставление можно было использовать для проверки (по крайней мере, в хроме, не проверял его в других браузерах).
– MarkosyanArtur
8 February 2017 в 12:29
Если вы хотите узнать, имеет ли пользователь доступ к вашему приложению с вкладки страницы facebook или проверки холста для подписанного запроса. Если вы этого не сделаете, возможно, пользователь не обращается к Facebook. Чтобы убедиться в подтверждении структуры и содержимого полей signed_request.
С помощью php-sdk вы можете получить подписанный запрос следующим образом:
$signed_request = $facebook->getSignedRequest();
Вы можете узнать больше о Signed Request здесь:
https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/
и здесь:
https://developers.facebook.com/docs/reference/login/signed-request/
window.frameElement
Возвращает элемент (например, & lt; iframe & gt; или & lt; object & gt;), в который встроено окно, или значение null, если окно находится на верхнем уровне. Таким образом, идентификационный код выглядит как
if (window.frameElement) {
// in frame
}
else {
// not in frame
}
Это стандартный и довольно новый метод. Он точно работает в Chrome и Firefox. Я не могу рекомендовать его как универсальное решение, но здесь я должен упомянуть.
frameElement
, выдает исключение SecurityError в iframe с перекрестным началом, согласно W3C ( WHATWG говорит, что он должен возвращать null вместо этого). Поэтому вы можете обернуть его внутри оператора try...catch
.
– Oriol
31 March 2016 в 14:20
This is rather new [...] method
& lt; - через вашу ссылку, это говорит IE5.5. Я тестировал IE9 - кажется, работает нормально.
– Neolisk
21 February 2017 в 16:31
Принятый ответ не работал для меня внутри скрипта содержимого Firefox 6.0 Extension (Addon-SDK 1.0): Firefox выполняет сценарий содержимого в каждом: окно верхнего уровня и во всех iframe.
Внутри скрипта содержимого я получаю следующие результаты:
(window !== window.top) : false
(window.self !== window.top) : true
Странная вещь в этом выходе заключается в том, что она всегда одинакова независимо от того, выполняется ли код внутри iframe или Окно верхнего уровня.
С другой стороны, Google Chrome, похоже, выполнил мой сценарий контента только один раз в окне верхнего уровня, поэтому вышеупомянутое не будет работать вообще.
Что, наконец, сработало для меня в сценарии содержимого в обоих браузерах, это:
console.log(window.frames.length + ':' + parent.frames.length);
Без iframe это печатает 0:0
, в окне верхнего уровня, содержащем один кадр, он печатает 1:1
, а в единственный iframe документа, который он печатает 0:1
.
Это позволяет моему расширению определять в обоих браузерах, если есть какие-либо фреймы, присутствующие, а также в Firefox, если он запускается внутри одного из фреймов.
document.defaultView.self === document.defaultView.top
или window !== window.top
. В сценарии содержимого добавочного SDK Firefox глобальный объект self
- это объект, используемый для связи с основным скриптом.
– Rob W
1 October 2013 в 22:39
Используйте эту функцию javascript как пример того, как это сделать.
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;
}
RoBorg прав, но я хотел добавить примечание к стороне.
В IE7 / IE8, когда Microsoft добавила вкладки в свой браузер, они сломали одну вещь, которая приведет к хаосу с вашим JS, если вы не будете осторожны .
Представьте себе этот макет страницы:
MainPage.html
IframedPage1.html (named "foo")
IframedPage2.html (named "bar")
IframedPage3.html (named "baz")
Теперь в рамке «baz» вы нажимаете ссылку (нет цели, загружается в рамку «baz»), она отлично работает.
Если загружаемая страница позволяет вызвать ее special.html, она использует JS для проверки, имеет ли «родительский кадр» родительский фрейм с именем «bar», он вернет true (ожидается).
Теперь скажем, что страница special.html при загрузке проверяет родительский фрейм (для существования и его имени, а если это «бар», он перезагружается в рамке бара, например
if(window.parent && window.parent.name == 'bar'){
window.parent.location = self.location;
}
[g8 [] Скажем, вместо того, чтобы нажимать на исходную ссылку, как обычно, и загружать страницу special.html в рамке «baz», щелкнул его или решил открыть его в новой вкладке.
Когда эта новая вкладка загружает ( без родительских кадров вообще! ) IE войдет в бесконечный цикл загрузки страницы! потому что IE «копирует» структуру кадра в JavaScript, так что новая вкладка имеет родительский элемент, а у этого родителя есть имя «bar».
Хорошей новостью является проверка:
if(self == top){
//this returns true!
}
в этой новой вкладке вернет true, и вы можете проверить это нечетное состояние.
window.parent
.
– user123444555621
10 September 2012 в 08:22
if (window.frames.length != parent.frames.length) { page loaded in iframe }
Но только если число ваших iframe отличается на вашей странице и странице, которые загружают вас в iframe. Не делайте iframe на своей странице, чтобы получить 100% гарантию результата этого кода