页面A通过iframe嵌入页面B:<body>
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
<script type="text/javascript">
   var initIframe = function(){       
       var ifm= document.getElementById("mainIframe");
       try{
       var bHeight = ifm.contentWindow.document.body.scrollHeight;
       var dHeight = ifm.contentWindow.document.documentElement.scrollHeight;       var height = Math.max(bHeight, dHeight);       ifm.height = height;
       }catch (ex){
         alert(ex.message);
       }
   } 
window.setInterval("initIframe()",200);  //iframe自适应高度
</script>
</body>B页面很长,而且设置第一个文本域聚焦:<head>
<script type="text/javascript">
  window.onload = function(){document.getElementById("test").focus();};
</script>
</head>
<body>
<br />
......<!--很多个<br />不一一列出,保证页面有滚动条-->
<br />
<input type="text" id="test" />
</body>我们知道当我们打开页面A时,iframe加载完B,B页面的文本域聚焦,此时焦点在B页面,B页面是通过iframe导入,即
<iframe width="100%" height="490" frameborder="0" scrolling="no" onload="this.height=100" src="B.html" id="mainIframe" />
这个iframe设置了scrolling="no",而且iframe做了自适应高度设置,此时B页面聚焦按理说聚焦过程页面会往下跑,但是此时显然不可以了,因为滚动条没有了,但是现在需要父页面的滚动条往下跑,达到子页面聚焦显示的效果。
此时方案一在父页面获取子页面第一个聚焦元素的位置,通过计算设置父页面的scrollTop是行不通的,因为焦点在子页面。
方案二在子页面计算聚焦元素的位置设置父页面窗口scrollTop,这样做会有个问题,父页面加载子页面需要时间,子页面加载文档需要时间,我在子页面window.onload里处理此操作子页面并没有反应,在子页面获取父页面iframe元素,绑定onload事件,在onload结束后操作,也行不通。只有在子页面设置延时,setTimeout,此时可以出现所要的效果,但是这并不是什么好办法,应为我们无法判别网络延时。求好的解决方案,150分奉上,求大神指教方案一://A页面处理
 var initIframe = (function(){
   var top = 0;
   var temp = false;
   return function() {
       
       var ifm= document.getElementById("mainIframe");
       try{
       var bHeight = ifm.contentWindow.document.body.scrollHeight;
       var dHeight = ifm.contentWindow.document.documentElement.scrollHeight;
       if(ifm.contentWindow.document){
          var subDoc = ifm.contentWindow.document;
          
          if(top){
            //alert(top);
            if(document.documentElement && document.documentElement.scrollTop){
               document.documentElement.scrollTop = top;
               
            }else if(document.body){
               document.body.scrollTop = top;
               
            }
            temp = true;
          }else if(!top && !temp){
            top = $(":focus:first",subDoc).offset().top;
          }
       }
       var height = Math.max(bHeight, dHeight);       ifm.height = height;
       }catch (ex){
         alert(ex.message);
       }
   } 
})();window.setInterval("initIframe()",3000); 方案二:window.onload = function(){
   document.getElementById("test").focus();
   var $input = $("#test");
   var top = $input.offset().top;
   var ifm = parent.document.getElementById("mainIframe");
   if ( $.browser.msie ) {
ifm.attachEvent( "onload", finish );
} else {
ifm.onload = $.browser.opera ? function(){ this.onload = finish; } : finish;

}function finish(){
   if(document.documentElement && document.documentElement.scrollTop){
      document.documentElement.scrollTop = 0;
      parent.document.documentElement.scrollTop = top;
      
   }else if(document.body){
      parent.document.body.scrollTop = top;
      
   }
}代码中混用jQuery只是为了用它的offset方法,以后代码自会优化

解决方案 »

  1.   

    楼主就是想打开的时候浏览器显示出<input type="text" id="test" />,并且方案1、2如何也有详细描述了:1不行,2在本地可以成功,但不能保证放在网络后能成功。
      

  2.   

    就是要显示聚焦的地方吗 在B页面加个锚点吧
    <head>
    <script type="text/javascript">
      window.location="B.html#aaa";
      window.onload = function(){document.getElementById("test").focus();};
    </script>
    </head>
    <body>
    <br />
    <br />
    <br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br /><br />
    <br />
    <br />
    <br />
    ......<!--很多个<br />不一一列出,保证页面有滚动条-->
    <br />
    <a name="aaa"></a>
    <input type="text" id="test" />
    </body>
      

  3.   

    谢谢回复,你的这个方法对于单个页面在显示时显示到锚点所在位置是可行的,我这个是父页面嵌入子页面的情况,父页面嵌入子页面用的是iframe框架,框架高度自适应,也就是说A页面打开时B无法到达锚点位置。
    现在的解决方案为://B页面
    var timer,top;window.onload = function(){
       document.getElementById("test").focus();
       var $input = $("#test");
       top = $input.offset().top;
       var ifm = parent.document.getElementById("mainIframe");
       finish();
    }function finish(){
       if(document.documentElement){
          document.documentElement.scrollTop = 0;
          parent.document.documentElement.scrollTop = top;
          
       }else if(document.body){
          parent.document.body.scrollTop = top;
          
       }
       
       if((parent.document.documentElement.scrollTop || parent.document.body.scrollTop) && timer){
          clearTimeout(timer);
       }else{
          timer = setTimeout(finish,20);
       }
    }简单说下,在B页面设置setTimeout,重复设置父页面scrollTop 值,并监听父页面的scrollTop 是否有值,如果有值则清掉延时函数。这个方法上传到服务器,稍微改下是可以用的。但这并不是什么好办法。
      

  4.   

    现在浏览器对iframe开始有限制了,比如chrome就不能parent.xxx直接执行一些父页面的东西,能够少用的话最好少用,当然这是题外话。
      

  5.   

    是啊,我们需求就要求主页面嵌iframe框架来布局,也不搞清楚这么做的弊病,现在因为这个布局发现的问题越来越多了,而且都很难解决。改成div布局这些问题就都不存在了。在等等有什么好答案吧,没的话就结贴了,诶~
      

  6.   

    楼主想知道的是主窗体与子窗体的关系吧
    下面的例子是一个子窗体调用方法改变父窗体主页面 cc.html<html>
    <head>
    <script type="text/javascript">
     function temp(id) {
     document.getElementById("temp").src = id;
      
     }
      function temps(id) {
      alert(id);
     }
    </script>
    </head>
    <body>
     主页
    <a href="#" id="bb.html" onclick="temp(this.id);" > bb</a>
    <a href="#" id="xx.html" onclick="temp(this.id);" > cc</a>
    <Iframe id="temp" src="xx.html" width="500" heitht="600">aa</IFRAME>
    </body>
    </html>子页面 xx.html<html><body>
     这是第一个子页面
    </body>
    </html>子页面 bb.html<html>
    <body>
    第二个子页面 
    <a href="#" id="xx.html" onclick="window.parent.temp(this.id);" > cc</a>
    </body>
    </html>把这三个页面放在同一个目录下面 ,打开主页面试一下再对着代码看一下你就会找到你所需要的东西了
    以下是iframe的一些语法
    标记的使用格式是: 
      <Iframe src="URL" width="x" height="x" scrolling="[OPTION]" frameborder="x"></iframe> 
      src:文件的路径,既可是HTML文件,也可以是文本、ASP等; 
      width、height:"画中画"区域的宽与高; 
      scrolling:当SRC的指定的HTML文件在指定的区域不显不完时,滚动选项,如果设置为NO,则不出现滚动条;如为Auto:则自动出 现滚动条;如为Yes,则显示; 
      FrameBorder:区域边框的宽度,为了让“画中画“与邻近的内容相融合,常设置为0 
      

  7.   

    恩,你说的很详细,如果你有时间的话可以看看我问题中的描述和方案中的代码实现,其实父子页面的调用关系我已经用到了,iframe元素的各类属性我也明白,主要是主页面中的iframe加载src需要时间,子页面加载文档需要时间,而子页面不能很顺利地在主页面的iframe加载完且子页面文档加载完时给主页面有效设置body的scrollTop属性,有点绕,这样讲还算清楚吗?
      

  8.   

    这样算是满足需求了,只是你这个聚焦怎么个说法以,一定要表单项在页面上方?a.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body>
    <div style="height:200px;">a</div>
    <iframe width="100%" height="490" frameborder="0" scrolling="no" src="b.html" id="mainIframe" /></iframe>
    <div style="height:200px;">b</div>
    </body>
    </html>b.html<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>无标题文档</title>
    </head>
    <body>
    <p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p><p>a</p>
    <input type="text" id="test" />
    <script type="text/javascript">
    window.onload = function() {
    parent.document.getElementById('mainIframe').style.height = document.documentElement.scrollHeight + 'px';
    document.getElementById("test").focus();
    }
    </script>
    </body>
    </html>