tags:

views:

520

answers:

5

I have problem calling a javascript function in an iframe from the parent page. Here is my two pages:

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>

(I know that document.all isn't recommended but this page should only be viewed with IE internally and I don't think that's the problem)

When I press the Reset-button I get "resultFrame found" and "resultFrame.Reset NOT found". It seems to have a reference to the frame but can't call the function on the frame, why is that?

+3  A: 

Use:

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

to access the Reset function in the iframe

document.getElementById("resultFrame") will get the iframe in your code, and contentWindow will get the window object in the iframe. Once you have the child window, you can refer to javascript in that context.

Also see http://stackoverflow.com/questions/251420/invoking-javascript-in-iframe-from-parent-page -- in particular the answer from bobince.

Jonathan Fingland
A: 

objectframe.contentWindow.Reset() you need reference to the top level element in the frame first.

Aliixx
+1  A: 

Call

window.frames['resultFrame'].Reset();
ArsenMkrt
A: 

When you access resultFrame through document.all it only pulls it as an HTML element, not a window frame. You get the same issue if you have a frame fire an event using a "this" self-reference.

Replace:

document.all.resultFrame.Reset();

With:

window.frames.resultFrame.Reset();

Or:

document.all.resultFrame.contentWindow.Reset();
Coding With Style
+1  A: 

Instead of getting the frame from the document, try getting the frame from the window object.

in the above example change this:

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

to

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

the problem is that the scope of the javascript inside the iframe is not exposed through the DOM element for the iframe. only window objects contain the javascript scoping information for the frames.

barkmadley