天天看點

【html】--------------iframe-------------【劉】

iframe基本操作

  通常我們使用iframe直接直接在頁面嵌套iframe标簽指定src就可以了。

<iframe src="./register.html" frameborder="0"></iframe>      

我們來看看在iframe中還可以設定些什麼屬性

iframe常用屬性:
1.frameborder:是否顯示邊框,1(yes),0(no)
2.height:架構作為一個普通元素的高度,建議在使用css設定。
3.架構作為一個普通元素的寬度,建議使用css設定。
4.name:架構的名稱,window.frames[name]時專用的屬性。
5.scrolling:架構的是否滾動。yes,no,auto。
6.src:内架構的位址,可以使頁面位址,也可以是圖檔的位址。
7.srcdoc , 用來替代原來HTML body裡面的内容。但是IE不支援, 不過也沒什麼卵用
8.sandbox: 對iframe進行一些列限制,IE10+支援      

上面一些tag,會在下文進行穿插說明,單個不好說。

我們通常使用iframe最基本的特性,就是能自由操作iframe和父架構的内容(DOM). 但前提條件是同域. 如果跨域頂多隻能實作頁面跳轉

window.location.href

.

那什麼是同域/ 什麼是跨域呢?

就是判斷你的url首部是否一樣,下面會有講解,這裡隻是提及。

同域不同域的問題:

A:<iframe id="mainIframe" name="mainIframe" src="/main.html" frameborder="0" scrolling="auto" ></iframe>
B:<iframe id="mainIframe" name="mainIframe" src="http://www.baidu.com" frameborder="0" scrolling="auto" ></iframe>      

使用A時,因為同域,父頁面可以對子頁面進行改寫,反之亦然。

使用B時,不同域,父頁面沒有權限改動子頁面,但可以實作頁面的跳轉

這裡,我們先從簡單的開始,當首頁面和iframe同域時,我們可以幹 些什麼。

擷取iframe裡的内容

主要的兩個API就是contentWindow,和contentDocument

iframe.contentWindow, 擷取iframe的window對象

iframe.contentDocument, 擷取iframe的document對象

這兩個API隻是DOM節點提供的方式(即getELement系列對象)

var iframe = document.getElementById("iframe1");
var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
       console.log("window",iwindow);//擷取iframe的window對象
       console.log("document",idoc);  //擷取iframe的document
       console.log("html",idoc.documentElement);//擷取iframe的html
       console.log("head",idoc.head);  //擷取head
       console.log("body",idoc.body);  //擷取body      

另外更簡單的方式是,結合Name屬性,通過window提供的frames擷取.

<iframe src ="/index.html" id="ifr1" name="ifr1" scrolling="yes">
  <p>Your browser does not support iframes.</p>
</iframe>
<script type="text/javascript">
    console.log(window.frames['ifr1'].window);
console.dir(document.getElementById("ifr1").contentWindow);
</script>      

其實window.frames['ifr1']傳回的就是window對象,即

window.frames['ifr1']===window      

這裡就看你想用哪一種方式擷取window對象,兩者都行,不過本人更傾向于第二種使用frames[xxx].因為,字母少啊喂~ 然後,你就可以操控iframe裡面的DOM内容。

在iframe中擷取父級内容

同理,在同域下,父頁面可以擷取子iframe的内容,那麼子iframe同樣也能操作父頁面内容。在iframe中,可以通過在window上挂載的幾個API進行擷取.

window.parent 擷取上一級的window對象,如果還是iframe則是該iframe的window對象
window.top 擷取最頂級容器的window對象,即,就是你打開頁面的文檔
window.self 傳回自身window的引用。可以了解 window===window.self(腦殘)      

iframe的輪詢

話說在很久很久以前,我們實作異步發送請求是使用iframe實作的~!

怎麼可能!!!

真的史料為證(自行google), 那時候為了不跳轉頁面,送出表單時是使用iframe送出的。現在,前端發展尼瑪真快,websocket,SSE,ajax等,逆天skill的出現,颠覆了iframe, 現在基本上隻能活在IE8,9的浏覽器内了。 但是,寶寶以為這樣就可以不用了解iframe了,而現實就是這麼殘酷,我們目前還需要相容IE8+。是以,iframe 實作長輪詢和長連接配接的trick 我們還是需要涉獵滴。

iframe長輪詢

如果寫過ajax的童鞋,應該知道,長輪詢就是在ajax的readyState = 4的時,再次執行原函數即可。 這裡使用iframe也是一樣,異步建立iframe,然後reload, 和背景協商好, 看背景哥哥們将傳回的資訊放在,然後擷取裡面資訊即可. 這裡是直接放在body裡.

var iframeCon = docuemnt.querySelector('#container'),
        text; //傳遞的資訊
    var iframe = document.createElement('iframe'),
        iframe.id = "frame",
        iframe.style = "display:none;",
        iframe.name="polling",
        iframe.src="target.html";
    iframeCon.appendChild(iframe);
    iframe.onload= function(){
        var iloc = iframe.contentWindow.location,
            idoc  = iframe.contentDocument;
        setTimeout(function(){
            text = idoc.getElementsByTagName('body')[0].textContent;
            console.log(text);
            iloc.reload(); //重新整理頁面,再次擷取資訊,并且會觸發onload函數
        },2000);
    }      

這樣就可以實作ajax的長輪詢的效果。 當然,這裡隻是使用reload進行擷取,你也可以添加iframe和删除iframe的方式,進行發送資訊,這些都是根據具體場景應用的。另外在iframe中還可以實作異步加載js檔案,不過,iframe和首頁是共享連接配接池的,是以還是很蛋疼的,現在基本上都被XHR和hard calllback取締了,這裡也不過多介紹了。

自适應iframe之蜜汁廣告

網頁為了賺錢,引入廣告是很正常的事了。通常的做法就是使用iframe,引入廣告位址就可以了,然後根據廣告内容設定相應的顯示框。但是,為什麼是使用iframe來進行設定,而不是在某個div下嵌套就行了呢?

要知道,廣告是與原文無關的,這樣寫死進去,會造成網頁布局的紊亂,而且,這樣勢必需要引入額外的css和js檔案,極大的降低了網頁的安全性。 這些所有的弊端,都可以使用iframe進行解決。 

我們通常可以将iframe了解為一個沙盒,裡面的内容能夠被top window 完全控制,而且,首頁的css樣式是不會入侵iframe裡面的樣式,這些都給iframe的廣告命運埋下伏筆。可以看一下各大站點是否都在某處放了些廣告,以維持生計比如:W3School

但,預設情況下,iframe是不适合做展示資訊的,是以我們需要對其進行decorate.

自适應iframe

預設情況下,iframe會自帶滾動條,不會全屏.如果你想自适應iframe的話:第一步:去掉滾動條

<iframe src="./iframe1.html" id="iframe1" scrolling="no"></iframe>      

第二步,設定iframe的高為body的高

var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
iframe.height = idoc.body.offsetHeight;      
<iframe id="google_ads_frame2" name="google_ads_frame2" width="160" height="600" frameborder="0" src="target.html" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true"></iframe>