天天看點

iframe js自适應高度

iframe在實際開發中應該算是比較常見的,在一些情況下iframe的高度是不确定,甚至是時時變化的

一般這種情況會有下面幾種情況:

1、父頁面和iframe頁面在同一個域下,這種情況最好解決。在iframe頁面裡通過window.parent即可定位到父頁面的window對象,然後,通過定時器來檢測iframe頁面的高度變化,來設定父頁面的相應容器的高度即可。

    執行個體代碼:

    父頁面:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <iframe src="041.php" id="if" frameborder="0"></iframe>
</body>
</html>      

子頁面:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body style="background:red">
  <script type="text/javascript">
    (function(){
      var doc = document,
        //擷取父頁面的容器
        par = window.parent.document.getElementById('if'),        
        body = doc.body,
        div,height;  
      setTimeout(function (){
        div = doc.createElement('br');
        body.appendChild(div);
        //目前頁面的高度
        height = body.offsetHeight;  
        //設定容器高度      
        par.style.height=height + 'px';
        //定時來執行
       // setTimeout(arguments.callee,300);
      },100);
    })();
  </script>
  <div class="span12"><h1>Demo</h1>

  <p>WEB前端研發工程師,在國内算是一個朝陽職業,這個領域沒有學校的正規教育,大多數人都是靠自己自學成才。本文主要介紹自己從事web開發以來(從大二至今)看過的書籍和自己的成長過程,目的是給想了解JavaScript或者是剛接觸JavaScript的朋友,介紹如何通過循序漸進的看書來學習javascript。</p>
  <p>一。 入門級 :就是有一定的基礎(比如最常見的HTML标簽及其屬性、事件、方法;最常見的CSS屬性;基礎的JavaScript程式設計能力),能夠完成一些簡單的WEB前端需求。</p>
  <p>推薦:《JavaScript dom 程式設計藝術》</p>
  <p>理由:此書絕對是入門的好書,本人也是在接觸JS一段時間後才看的這本書。此書從JS的曆史 - JS基礎文法知識 - DOM介紹和簡單的使用。現在這本書已經出了第二版,需要的朋友直接第二版就行。</p>
  <p>評價:簡潔,實用,詳細,易懂,書不厚,相信很快就能看完。</p>
  <p>當然,作為入門書的話《JavaScript權威指南》也非常強大(這名字可不是白起),其實說起來也慚愧,本人至今都沒有買過這本書,最開始是因為這個書實在是小貴,隻好借朋友的看,不過也就看了個周末。網上關于此書的評價很多,意思大概都是說這書就是一個JS的文檔手冊,如果你有閑錢,并且習慣翻書查詢,那麼就來一本吧。順便提醒一句,這本書的第六版英文版已經出來了。</p>
  <p>二。初級開發:本人以前的DEV leader兼恩師這麼說過:"初級開發人員的标志就是需要在中級和進階開發的指導下完成工作"。首先不要苛責代碼的對錯嚴謹,畢竟每個程式員都有這樣的一個過程,就是這個級别的特征。</p>

</div>

</body>
</html>      

2、父頁面和子頁面不在同一個域下。

這種情況下,基于安全性的考慮,一些浏覽器中通過window.parent就通路不到父頁面的window對象,解決辦法如下:

    ①在iframe裡面B添加一個隐藏的iframe标簽;

    ②iframe引用的檔案C是和父頁面在同一個域下面的;

    ③通過循環來檢測B頁面上中height的高度 ,并且設定給隐藏的iframe标簽的位址中作為參數;

    ④在iframe頁面c中也設定一個定時器來讀取位址的值,可以擷取b頁面的高度;

    ⑤c頁面可以通過window.parent通路到父頁面的window對象,并設定相應容器的高度

執行個體代碼:

父頁面:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <div value="1">
    <iframe id="aaa"  src="http://edsn.sinaapp.com/demo/iframe/b.html" frameborder="2px"></iframe>
  </div>  
</body>
</html>      

b頁面

<!DOCTYPE HTML>
<html lang="en-US">
  <head>
    <meta charset="UTF-8">
    <title></title>
  </head>
  <body style="background:red">
    <iframe id="p" src="http://sirzxj.sinaapp.com/iframe/2/c.html#" style="display:none" frameborder="2px"></iframe>
    <script type="text/javascript">
      (function(){
        var doc = document,
          body = doc.body,   
          g = doc.getElementById('p'),
          src = g.src.split('#')[0] + '#',
          br,height;
        setTimeout(function(){
          br = doc.createElement('br');
          body.appendChild(br);
          height = doc.body.offsetHeight;
          g.src= src + height;
          setTimeout(arguments.callee,500);
        },500);
        //alert()
        g.src += 'abc';
      })()
    </script>
  </body>
</html>      

c頁面:

<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <script type="text/javascript">
    (function(){
      var tops = window.top.document.getElementById('aaa');    
        setTimeout(function(){
        var loc = window.location.href.split('#')[1];
        tops.style.height = loc +'px';
        setTimeout(arguments.callee,500);
      },500);
    })()
  </script>
</body>
</html>      

繼續閱讀