Как получить доступ к родительскому 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;
}