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



Answers

Просто вызовите 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;
}
Question

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

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

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




Старый вопрос, но у меня была такая же проблема, и я нашел способ получить iframe. Это просто вопрос итерации через массив frames [parent frames] родительского окна и тестирование содержимого 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). Таким образом, цикл через них кажется единственным способом, если вы не хотите использовать идентификаторы.




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

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

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




Попробуйте это, в вашем родительском фрейме настройте 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




Links