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

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

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

РЕДАКТИРОВАТЬ: Там iframes генерируются динамически

9 ответов

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

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

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

parent.document.getElementById(window.name);

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

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

/**
 * @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;
}

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

В вашем фрейме позвоните:

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);

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

Узнайте больше об API postMessage в блоге Джона Ресигса здесь

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

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). Так что циклический просмотр их кажется единственным способом, если только вы не хотите использовать идентификаторы.

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

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

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

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

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

Может быть, просто использовать

window.parent

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

window.top

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

// 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;
}
Другие вопросы по тегам