Вызов функции javascript в iframe
У меня проблема с вызовом функции JavaScript в iframe
с родительской страницы. Вот мои две страницы:
mainPage.html
<html>
<head>
<title>MainPage</title>
<script type="text/javascript">
function Reset()
{
if (document.all.resultFrame)
alert("resultFrame found");
else
alert("resultFrame NOT found");
if (typeof (document.all.resultFrame.Reset) == "function")
document.all.resultFrame.Reset();
else
alert("resultFrame.Reset NOT found");
}
</script>
</head>
<body>
MainPage<br>
<input type="button" onclick="Reset()" value="Reset"><br><br>
<iframe height="100" id="resultFrame" src="resultFrame.html"></iframe>
</body>
</html>
resultFrame.html
<html>
<head>
<title>ResultPage</title>
<script type="text/javascript">
function Reset()
{
alert("reset (in resultframe)");
}
</script>
</head>
<body>
ResultPage
</body>
</html>
(Я знаю, что document.all
не рекомендуется, но эту страницу нужно просматривать только с помощью IE, и я не думаю, что проблема)
Когда я нажимаю кнопку Reset, я получаю "resultFrame found" и "resultFrame.Reset NOT found". Кажется, что он ссылается на фрейм, но не может вызвать функцию в кадре, почему?
Ответы
Ответ 1
Использование:
document.getElementById("resultFrame").contentWindow.Reset();
для доступа к функции Reset в iframe
document.getElementById("resultFrame")
получит iframe в вашем коде, а contentWindow
получит объект window в iframe. Когда у вас есть дочернее окно, вы можете ссылаться на javascript в этом контексте.
Также см. ЗДЕСЬ, в частности ответ от bobince.
Ответ 2
Вместо того, чтобы получать кадр из документа, попробуйте получить кадр из объекта окна.
в приведенном выше примере измените это:
if (typeof (document.all.resultFrame.Reset) == "function")
document.all.resultFrame.Reset();
else
alert("resultFrame.Reset NOT found");
к
if (typeof (window.frames[0].Reset) == "function")
window.frames[0].Reset();
else
alert("resultFrame.Reset NOT found");
проблема заключается в том, что область действия javascript внутри iframe не отображается через элемент DOM для iframe. только оконные объекты содержат информацию о просмотре javascript для фреймов.
Ответ 3
Для еще большей надежности:
function getIframeWindow(iframe_object) {
var doc;
if (iframe_object.contentWindow) {
return iframe_object.contentWindow;
}
if (iframe_object.window) {
return iframe_object.window;
}
if (!doc && iframe_object.contentDocument) {
doc = iframe_object.contentDocument;
}
if (!doc && iframe_object.document) {
doc = iframe_object.document;
}
if (doc && doc.defaultView) {
return doc.defaultView;
}
if (doc && doc.parentWindow) {
return doc.parentWindow;
}
return undefined;
}
и
...
var el = document.getElementById('targetFrame');
getIframeWindow(el).reset();
...
Ответ 4
Вызов
window.frames['resultFrame'].Reset();
Ответ 5
objectframe.contentWindow.Reset()
вам нужно сначала ссылаться на элемент верхнего уровня в кадре.
Ответ 6
Первое и главное условие, которое необходимо выполнить, состоит в том, что и родительский, и iframe должны принадлежать одному и тому же происхождению. Как только это будет сделано, ребенок может вызвать родителя, используя метод window.opener, и родитель может сделать то же самое для ребенка, как указано выше.
Ответ 7
Когда вы получаете доступ к resultFrame через document.all, он вытягивает его только как элемент HTML, а не рамку окна. Вы получаете ту же проблему, если у вас есть фрейм, запускающий событие с использованием саморекламы "this".
Заменить:
document.all.resultFrame.Reset();
С
window.frames.resultFrame.Reset();
Или:
document.all.resultFrame.contentWindow.Reset();