Вызов функции javascript в iframe
-
05-07-2019 - |
Вопрос
У меня возникла проблема с вызовом функции 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, и я не думаю, что это проблема)
Когда я нажимаю кнопку сброса, я получаю "resultFrame найден" и "resultFrame.Сброс НЕ найден".Кажется, у него есть ссылка на фрейм, но он не может вызвать функцию в фрейме, почему это?
Решение
Использование:
document.getElementById("resultFrame").contentWindow.Reset();
чтобы получить доступ к функции сброса в iframe
document.getElementById("resultFrame")
получит iframe в вашем коде, и contentWindow
получит объект window в iframe.Как только у вас появится дочернее окно, вы можете обратиться к javascript в этом контексте.
Также смотрите ЗДЕСЬ в частности, ответ от bobince.
Другие советы
Вместо того чтобы получать фрейм из документа, попробуйте получить фрейм из объекта window.
в приведенном выше примере измените это:
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.только объекты window содержат информацию об области видимости javascript для фреймов.
Для еще большей надежности:
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');
var frame_win = getIframeWindow(el);
if (frame_win) {
frame_win.reset();
...
}
...
Звонить
window.frames['resultFrame'].Reset();
objectframe.contentWindow.Reset()
сначала вам нужна ссылка на элемент верхнего уровня во фрейме.
Первое и главное условие, которое должно быть выполнено, - это то, что и родительский файл, и iframe должны принадлежать одному и тому же источнику.Как только это будет сделано, дочерний элемент может вызвать родительский элемент, используя метод window.opener, и родительский элемент может сделать то же самое для дочернего элемента, как указано выше
Когда вы обращаетесь к resultFrame через document.все это извлекает его только как HTML-элемент, а не как рамку окна.Вы сталкиваетесь с той же проблемой, если у вас есть фрейм, запускающий событие с использованием самоссылки "this".
Заменить:
document.all.resultFrame.Reset();
С:
window.frames.resultFrame.Reset();
Или:
document.all.resultFrame.contentWindow.Reset();
Если вы не можете использовать его напрямую и если вы столкнулись с этой ошибкой:Заблокировал фрейм с исходным кодом "http://www..com" из-за доступа к фрейму с перекрестным исходным кодом.Вы можете использовать postMessage() Почтовое сообщение () вместо того, чтобы использовать функцию напрямую.