it-swarm.com.de

Aufrufen der JavaScript-Funktion in iframe

Ich habe Probleme beim Aufrufen einer JavaScript-Funktion in einer iframe von der übergeordneten Seite. Hier sind meine zwei Seiten:

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>

(Ich weiß, dass document.all nicht empfohlen wird, aber diese Seite sollte nur mit IE intern angezeigt werden, und ich denke nicht, dass dies das Problem ist.)

Wenn ich die Reset-Taste drücke, bekomme ich "resultFrame found" und "resultFrame.Reset NOT found". Es scheint einen Verweis auf den Frame zu haben, kann aber die Funktion nicht auf dem Frame aufrufen. Warum ist das so?

50
salle55

Benutzen:

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

um auf die Reset-Funktion im iframe zuzugreifen

document.getElementById("resultFrame") erhält den iframe in Ihrem Code und contentWindow das Fensterobjekt im iframe. Sobald Sie das untergeordnete Fenster haben, können Sie in diesem Zusammenhang auf Javascript verweisen.

Siehe auch HIER insbesondere die Antwort von Bobince.

95

Versuchen Sie, den Rahmen nicht aus dem Dokument, sondern aus dem Fensterobjekt abzurufen.

im obigen Beispiel ändern Sie dies:

if (typeof (document.all.resultFrame.Reset) == "function")
    document.all.resultFrame.Reset();
else
    alert("resultFrame.Reset NOT found");

zu

if (typeof (window.frames[0].Reset) == "function")
    window.frames[0].Reset();
else
    alert("resultFrame.Reset NOT found");

das Problem ist, dass der Gültigkeitsbereich des Javascript im iframe nicht über das DOM-Element für den iframe verfügbar gemacht wird. Nur Fensterobjekte enthalten die JavaScript-Bereichsinformationen für die Frames.

5
barkmadley

Für noch mehr Robustheit:

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

und 

...
var el = document.getElementById('targetFrame');

var frame_win = getIframeWindow(el);

if (frame_win) {
  frame_win.reset();
  ...
}
...
5

Anruf

window.frames['resultFrame'].Reset();
4
Arsen Mkrtchyan

objectframe.contentWindow.Reset() Sie müssen zuerst auf das Element der obersten Ebene im Frame verweisen.

3
Alex H

Die erste und vor allem Bedingung, die erfüllt sein muss, ist, dass sowohl der übergeordnete als auch der iFrame zu demselben Ursprung gehören sollten. Sobald dies erledigt ist, kann das Kind das übergeordnete Element mit der window.opener-Methode aufrufen, und das übergeordnete Element kann das gleiche wie oben für das untergeordnete Element ausführen

2

Wenn Sie über document.all auf resultFrame zugreifen, wird es nur als HTML-Element und nicht als Fensterrahmen abgerufen. Das gleiche Problem tritt auf, wenn Sie einen Frame mit einem "this" -Eigenverweis haben.

Ersetzen:

document.all.resultFrame.Reset();

Mit:

window.frames.resultFrame.Reset();

Oder:

document.all.resultFrame.contentWindow.Reset();
1

Wenn Sie es nicht direkt verwenden können und dieser Fehler auftritt: Blockiert einen Frame mit Origin " http: // www .. com" für den Zugriff auf einen Origin-Frames postMessage () anstatt die Funktion direkt zu verwenden.

0
user9384187