Frage

Ich habe Probleme eine JavaScript-Funktion in einem iframe von der übergeordneten Seite aufrufen. Hier ist 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 wird nicht empfohlen, aber diese Seite sollte nur intern mit IE angesehen werden, und ich glaube nicht, das ist das Problem)

Wenn ich die Reset-Taste drücken, erhalte ich „resultFrame gefunden“ und „resultFrame.Reset nicht gefunden“. Es scheint, einen Verweis auf den Rahmen zu haben, aber die Funktion auf dem Rahmen nicht nennen kann, warum das?

War es hilfreich?

Lösung

Verwendung:

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

die Reset-Funktion in der iframe zugreifen

document.getElementById("resultFrame") die iframe in Ihrem Code bekommen, und contentWindow wird das Fenster-Objekt in der iframe erhalten. Sobald Sie das Kind Fenster haben, können Sie Javascript in diesem Zusammenhang verweisen.

Siehe auch hier insbesondere die Antwort von bobince.

Andere Tipps

Statt den Rahmen aus dem Dokument zu bekommen, versuchen Sie das Bild aus dem Fenster Objekt zu bekommen.

im obigen Beispiel das ändern:

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");

das Problem ist, dass der Umfang der Javascript innerhalb des iframe nicht über das DOM-Element für den iframe ausgesetzt ist. nur Fenster-Objekte enthalten die Javascript-Scoping Informationen für den Rahmen.

Für eine noch größere 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();
  ...
}
...

Anruf

window.frames['resultFrame'].Reset();

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

Die erste und wichtigste Bedingung, die erfüllt werden muss, ist, dass sowohl die Eltern und iframe auf den gleichen Ursprung gehören sollen. Sobald das Kind getan ist, können die Eltern mit window.opener Methode aufrufen und die Eltern können für das Kind das gleiche tun wie oben

erwähnt

Wenn Sie resultFrame durch document.all zugreifen es zieht nur als HTML-Element, kein Fensterrahmen. Sie erhalten das gleiche Problem, wenn Sie einen Rahmen haben ein Ereignis Feuer eine „diese“ Selbstreferenz verwendet wird.

Ersetzen Sie:

document.all.resultFrame.Reset();

Mit:

window.frames.resultFrame.Reset();

Oder:

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

Wenn Sie es nicht direkt verwenden können, und wenn dieser Fehler auftritt: Blockierte einen Rahmen mit Ursprung „ http: // www ..com“ von einem Querursprungsrahmen erreichbar. Sie können postmessage () anstelle der Verwendung der Funktion direkt an.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top