Как получить доступ к родительскому iframe из JavaScript

Ну, у меня есть IFrame, который вызывает одну и ту же страницу домена. Моя проблема в том, что я хочу получить доступ к некоторой информации из этого родительского iframe с этой вызываемой страницы (из JavaScript). Как я могу получить доступ к этому iframe?

Подробности: Есть несколько IFRAME, как этот, который может загружать одну и ту же страницу, потому что я программирую среду Windows. Я намерен закрыть этот Iframe, поэтому мне нужно знать, что я должен закрыть изнутри. У меня есть массив, содержащий ссылки на эти iframes.

EDIT: там iframe генерируются динамически

Ответ 1

Также вы можете установить имя и ID равными значениями

<iframe id="frame1" name="frame1" src="any.html"></iframe>

чтобы вы могли использовать следующий код внутри дочерней страницы

parent.document.getElementById(window.name);

Ответ 2

Просто позвоните window.frameElement с вашей страницы в рамке. Если страница не находится в кадре, тогда frameElement будет null.

Другой способ (получение элемента окна внутри кадра менее тривиально), но для полноты:

/**
 * @param f, iframe or frame element
 * @return Window object inside the given frame
 * @effect will append f to document.body if f not yet part of the DOM
 * @see Window.frameElement
 * @usage myFrame.document = getFramedWindow(myFrame).document;
 */
function getFramedWindow(f)
{
    if(f.parentNode == null)
        f = document.body.appendChild(f);
    var w = (f.contentWindow || f.contentDocument);
    if(w && w.nodeType && w.nodeType==9)
        w = (w.defaultView || w.parentWindow);
    return w;
}

Ответ 3

Я бы рекомендовал использовать postMessage API.

В вашем iframe вызовите:

window.parent.postMessage({message: 'Hello world'}, 'http://localhost/');

На странице, в которую вы включаете iframe, вы можете слушать такие события:

window.addEventListener('message', function(event) {
      if(event.origin === 'http://localhost/')
      {
        alert('Received message: ' + event.data.message);
      }
      else
      {
        alert('Origin not allowed!');
      }

    }, false);

Кстати, также можно делать вызовы в других окнах, а не только iframes.

Подробнее о postMessage API в блоге John Resigs здесь

Ответ 4

Старый вопрос, но у меня была такая же проблема, и я нашел способ получить iframe. Это просто вопрос итерации через массив родительских окон [] и тестирование каждого кадра contentWindow на окно, в котором работает ваш код. Пример:

var arrFrames = parent.document.getElementsByTagName("IFRAME");
for (var i = 0; i < arrFrames.length; i++) {
  if (arrFrames[i].contentWindow === window) alert("yay!");
}

Или, используя jQuery:

parent.$("iframe").each(function(iel, el) {
  if(el.contentWindow === window) alert("got it");
});

Этот метод сохраняет назначение идентификатора для каждого iframe, что хорошо в вашем случае, поскольку они динамически создаются. Я не мог найти более прямой путь, так как вы не можете получить элемент iframe с помощью window.parent - он идет прямо к элементу родительского окна (пропуская iframe). Таким образом, цикл через них кажется единственным способом, если вы не хотите использовать идентификаторы.

Ответ 5

вы можете использовать parent для доступа к родительской странице. Поэтому для доступа к функции это будет:

var obj = parent.getElementById('foo');

Ответ 6

После установки идентификатора iframe вы можете получить доступ к iframe из внутреннего документа, как показано ниже.

var iframe = parent.document.getElementById(frameElement.id);

Хорошо работает в IE, Chrome и FF.

Ответ 7

Возможно, просто используйте

window.parent

в ваш iframe, чтобы получить вызывающий кадр/окна. Если у вас есть несколько вызывающих фреймов, вы можете использовать

window.top

Ответ 8

Попробуйте это, в родительском фрейме настройте IFRAME следующим образом:

<iframe id="frame1" src="inner.html#frame1"></iframe>
<iframe id="frame2" src="inner.html#frame2"></iframe>
<iframe id="frame3" src="inner.html#frame3"></iframe>

Обратите внимание, что идентификатор каждого кадра передается как якорь в src.

то в вашем внутреннем html вы можете получить доступ к идентификатору фрейма, который он загружает через location.hash:

<button onclick="alert('I am frame: ' + location.hash.substr(1))">Who Am I?</button>

то вы можете получить доступ к parent.document.getElementById() для доступа к тегу iframe изнутри iframe

Ответ 9

// just in case some one is searching for a solution
function get_parent_frame_dom_element(win)
{
    win = (win || window);
    var parentJQuery = window.parent.jQuery;
    var ifrms = parentJQuery("iframe.upload_iframe");
    for (var i = 0; i < ifrms.length; i++)
    {
        if (ifrms[i].contentDocument === win.document)
            return ifrms[i];
    }
    return null;
}