Какой самый верхний iframe в том же домене? - PullRequest
1 голос
/ 21 мая 2010

Как я могу получить самый верхний iframe, который находится в том же домене, т.е.

iframe level 1 example.org
    iframe level 2 example.org
    iframe level 2 example.org 
        iframe level 3 example.org <-- should return iframe level 1

iframe level 1 other-example.org
    iframe level 2 example.org
    iframe level 2 example.org 
        iframe level 3 example.org <-- should return iframe level 2

iframe level 1 other-example.org
    iframe level 2 example.org
    iframe level 2 example.org <-- should return iframe level 2 (this)

Мне это нужно, потому что у меня есть веб-сайт, который должен работать в фрейме другого домена и автономно.

На этом сайте есть сценарии, которые зависят от window.top, который должен быть не верхним, а верхним iframe в одном домене.

Ответы [ 2 ]

5 голосов
/ 21 мая 2010

Если вы попытаетесь получить доступ к родительскому объекту, находящемуся в другом домене, вы получите сообщение об ошибке.Вы можете использовать это для рекурсивной попытки доступа к родителю до тех пор, пока он не выйдет из строя, что-то вроде:

function getTopIframe(win) {
  try {
    return getTopIframe(win.parent);
  } catch(e) {
    return win;
  }
}

Редактировать:

Самое верхнее окно - это его собственный родитель, поэтому вам понадобится проверитьчто бы предотвратить вечный цикл, если верхнее окно находится в том же домене:

function getTopIframe(win) {
  try {
    if (win.parent != win) {
      return getTopIframe(win.parent);
    }
  } catch(e) {
  }
  return win;
}
1 голос
/ 12 апреля 2015

Ответ Гуффы не найдет самое верхнее окно того же домена в неверном случае, когда окно из другого домена находится между двумя окнами одного домена. Чтобы справиться с этим случаем, нам нужно всегда проходить весь путь до самого верхнего окна и отдельно отслеживать окна из одного домена.

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

function topSameDomainWindow(win) {
  win = win || window;
  var top = win;
  while (win.parent != win) {
    try {
      // Will throw when the parent window is from a different domain
      win.parent.document;
      top = win;
    } catch (e) {}
    win = win.parent;
  }
  return top;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...