13

I have a document which has a nested frameset. I need to access one of the nested frames, named "sq_main", and access content inside this frame. Here is my structure:

<html>
<head>
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<frameset rows="28,*" frameborder="0" border="0">
  <frame src="/_admin/?SQ_BACKEND_PAGE=header" name="sq_header" scrolling="no" marginwidth="0" marginheight="0">
  <frameset cols="380,10,*" frameborder="0" border="0" id ="main_frameset">
    <frame src="/_admin/?SQ_BACKEND_PAGE=sidenav" name="sq_sidenav" scrolling="no" marginwidth="0" marginheight="0">
    <frame src="/_admin/?SQ_BACKEND_PAGE=resizer" name="sq_resizer" scrolling="no" marginwidth="0" marginheight="0">
    <frame src="/_admin?SQ_BACKEND_PAGE=main&assetid=43&sq_from_frontend=1" name="sq_main" marginwidth="0" marginheight="0" scrolling="yes">
  </frameset>
</frameset>
<noframes></noframes>
</html>

Sadly, I can't change the code, that is why I need to access it with jQuery. I have tried to write a jQuery selector to access the "sq_main" frame, but no luck so far:

$('body', parent.frames[0].sq_main).prepend('<h1>TEST!!!!</h1>');

Ideas on how to drill down into this ugly structure? :)

2
  • I can't find sq_main in your example; is the code above the content of sq_main or is the example missing something? Commented May 31, 2010 at 7:04
  • Yes, it is right in the example, it is the last frame. <frame src="/_admin?SQ_BACKEND_PAGE=main&assetid=43&sq_from_frontend=1" name="sq_main" marginwidth="0" marginheight="0" scrolling="yes"> Commented May 31, 2010 at 7:17

3 Answers 3

13

Try to navigate one step at a time. IIRC, the frames array only works with iframes. Try the selector frame[name = 'sq_main'] instead.

Example by Ronny Sherer:

var frameDocument = $('frame[name="mainFrame"]', top.document)[0].contentDocument;
$(frameDocument).find('body').prepend('<h1>TEST!!!!</h1>');
Sign up to request clarification or add additional context in comments.

5 Comments

I tried: alert($("frame[name = 'sq_main']").children('#sq-search-wait-popup-details').text()); But that does not seem to work..
Re 1, frameset should be used instead of a body element: w3schools.com/tags/tag_frameset.asp
hi, is it possible to do it in native javascript.
@mohit: Sure but I suggest to assign IDs to the frames, so you can use getElementById() Otherwise, get the elements by tag and search the result.
Partial details. Had to look at zensheno's answer in order to understand. Clearer example: var frameDocument = $('frame[name="mainFrame"]', top.document)[0].contentDocument; $(frameDocument).find('body').prepend('<h1>TEST!!!!</h1>');
5
var sql_mainJQ = $("frame[name='sql_main']", top.document);

//$('body', sql_mainJQ.contents()).prepend("TEST!!!!"); // :( Bad

var frameContent = sql_mainJQ[0].contentDocument;
if ($.browser.msie) {
    frameContent = mainFrameJQ[0].contentWindow.document;
} else {
    frameContent = mainFrameJQ[0].contentDocument;
}
$('body', sql_mainJQ.contents()).prepend("TEST!!!!"); // :> Maybe OK!

Comments

0
<html>
<head>
    <title>frames.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<frameset rows="100,*" frameborder="1" border="2">  
                <frame src="helloworld.html" name="sq_header" id="sq_header" scrolling="yes" marginwidth="0" marginheight="0">
                   <frameset cols="380,300,*" frameborder="1" border="2" id ="main_frameset">  
                   <frame src="helloworld.html" name="sq_sidenav"  id="sq_sidenav" scrolling="yes" marginwidth="0" marginheight="0"> 
                   <frame src="anotherpage.html" name="sq_resizer" id="sq_resizer" scrolling="yes" marginwidth="0" marginheight="0">   
                   <frame src="helloworld.html" name="sq_main" id="sq_main" marginwidth="0" marginheight="0" scrolling="yes">  
                   </frameset> 
                   </frameset>
<noframes>
</noframes>
</html>
<html>
<head>
    <title>anotherpage.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <script type="text/javascript" src="http://www.google.com/jsapi"></script>

    <script type="text/javascript">
                  //http://encosia.com/3-reasons-why-you-should-let-google-host-jquery-for-you/
                  // You may specify partial version numbers, such as "1" or "1.3",
                  //  with the same result. Doing so will automatically load the 
                  //  latest version matching that partial revision pattern 
                  //  (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
                  google.load("jquery", "1.6.2");

                  google.setOnLoadCallback(function() {
                    // Place init code here instead of $(document).ready()
                  });
    </script>

    <script language="Javascript">
                var d = new Date();
                var n = d.getTime(); 

                $(document).ready(function(){  
                   $('#title').html($("title").html());
/*
this is to work in safari
see "Updated answer provided below....looks like a setTimeout maybe needed as the     frames aren't loaded when the initial startup script runs. – David Hoerster Aug 21 '10 at 16:38
url: http://stackoverflow.com/questions/3534082/jquery-access-table-inside-a-frame
*/
setTimeout(writemsg, 2000);
function writemsg() {
                   $('#helloworld',top.frames["sq_main"].document).html("Write from "+ $("title").html()+" in sq_main at "+ n);
}
                  }); 

    </script>

</head>
<body>
    <div id="title">
    </div>
    </p>
    <div id="helloworld">
        Hello World JQuery!</div>
</body>
</html>
<html>
<head>
    <title>helloworld.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <script type="text/javascript" src="http://www.google.com/jsapi"></script>

    <script type="text/javascript">
                  //http://encosia.com/3-reasons-why-you-should-let-google-host-jquery-for-you/
                  // You may specify partial version numbers, such as "1" or "1.3",
                  //  with the same result. Doing so will automatically load the 
                  //  latest version matching that partial revision pattern 
                  //  (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
                  google.load("jquery", "1.6.2");

                  google.setOnLoadCallback(function() {
                    // Place init code here instead of $(document).ready()
                  });
    </script>

    <script language="Javascript">
                $(document).ready(function(){  
                   $('#title').html($("title").html());
                  }); 

    </script>

</head>
<body>
    <div id="title">
    </div>
    </p>
    <div id="helloworld">
        Hello World JQuery!</div>
</body>
</html>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.