【问题标题】:jQuery: Access frame in nested framesetjQuery:嵌套框架集中的访问框架
【发布时间】:2010-05-31 06:55:12
【问题描述】:

我有一个包含嵌套框架集的文档。我需要访问名为“sq_main”的嵌套框架之一,并访问该框架内的内容。这是我的结构:

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

遗憾的是,我无法更改代码,这就是我需要使用 jQuery 访问它的原因。我试图编写一个 jQuery 选择器来访问“sq_main”框架,但到目前为止还没有运气:

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

关于如何深入了解这个丑陋结构的想法? :)

【问题讨论】:

  • 我在你的例子中找不到sq_main;上面的代码是sq_main 的内容还是该示例缺少某些内容?
  • 是的,在示例中是正确的,它是最后一帧。

标签: javascript jquery frames frameset


【解决方案1】:

尝试一次导航一步。 IIRC,frames 数组仅适用于iframes。请改用选择器frame[name = 'sq_main']

Ronny Sherer的例子:

var frameDocument = $('frame[name="mainFrame"]', top.document)[0].contentDocument;
$(frameDocument).find('body').prepend('<h1>TEST!!!!</h1>');

【讨论】:

  • 我试过了: alert($("frame[name = 'sq_main']").children('#sq-search-wait-popup-details').text());但这似乎不起作用..
  • Re 1,应该使用框架集而不是正文元素:w3schools.com/tags/tag_frameset.asp
  • @starwed:谢谢,我已经确定了答案。
  • 嗨,是否可以在本机 javascript 中做到这一点。
  • @mohit: 当然可以,但是我建议给框架分配ID,所以你可以使用getElementById() 否则,通过标签获取元素并搜索结果。
【解决方案2】:
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!

【讨论】:

    【解决方案3】:
    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2016-10-24
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多