Вызов функции JavaScript в iframe - PullRequest
       12

Вызов функции JavaScript в iframe

54 голосов
/ 21 октября 2009

У меня проблема с вызовом функции 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 found» и «resultFrame.Reset NOT found». Кажется, у него есть ссылка на фрейм, но он не может вызвать функцию фрейма, почему это так?

Ответы [ 8 ]

100 голосов
/ 21 октября 2009

Использование:

document.getElementById("resultFrame").contentWindow.Reset();

для доступа к функции сброса в iframe

document.getElementById("resultFrame") получит iframe в вашем коде, а contentWindow получит объект окна в iframe. Если у вас есть дочернее окно, вы можете обратиться к javascript в этом контексте.

Также см. ЗДЕСЬ в частности ответ от Бобинса.

5 голосов
/ 03 августа 2012

Для еще большей прочности:

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();
  ...
}
...
5 голосов
/ 21 октября 2009

Вместо получения рамки из документа, попробуйте получить рамку из объекта окна.

в приведенном выше примере измените это:

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 для фреймов.

4 голосов
/ 21 октября 2009

Вызов

window.frames['resultFrame'].Reset();
3 голосов
/ 21 октября 2009

objectframe.contentWindow.Reset() сначала вам нужна ссылка на элемент верхнего уровня в кадре.

2 голосов
/ 28 мая 2015

Первое и главное условие, которое необходимо выполнить, это то, что родительский элемент и iframe должны принадлежать одному источнику. Как только это будет сделано, потомок может вызвать родителя с помощью метода window.opener, а родитель может сделать то же самое для потомка, как упомянуто выше

1 голос
/ 21 октября 2009

Когда вы обращаетесь к resultFrame через document.all, он извлекает его только как элемент HTML, а не как оконную рамку. Вы получаете ту же проблему, если у вас есть кадр, который запускает событие, используя «эту» собственную ссылку.

Заменить:

document.all.resultFrame.Reset();

С:

window.frames.resultFrame.Reset();

Или:

document.all.resultFrame.contentWindow.Reset();
0 голосов
/ 28 февраля 2018

Если вы не можете использовать его напрямую, и если вы столкнулись с этой ошибкой: Заблокирован фрейм с происхождением "http://www..com" от доступа к фрейму перекрестного происхождения. Вы можете использовать postMessage () вместо непосредственного использования функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...