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

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

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

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

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

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

parent.document.getElementById(window.name);

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

я бы рекомендовал использовать 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);

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

Узнайте больше об 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

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

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 javascript — изменение уровня масштабирования браузера — переполнение стека

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