深入理解iframe

来源:https://www.cnblogs.com/Leophen/archive/2019/08/24/11403800.html
-Advertisement-
Play Games

一、什麼是 iframe iframe 用於在頁面內顯示頁面,使用 <iframe> 會創建包含另外一個文檔的內聯框架(即行內框架) 二、iframe 的常用屬性 1、width 定義 iframe 的寬度 2、height 定義 iframe 的高度 3、name 規定 iframe 的名稱 4、 ...


一、什麼是 iframe

iframe 用於在頁面內顯示頁面,使用 <iframe> 會創建包含另外一個文檔的內聯框架(即行內框架)

<iframe src="URL"></iframe>

 

 

二、iframe 的常用屬性

 

1、width

定義 iframe 的寬度

 

2、height

定義 iframe 的高度

 

3、name

規定 iframe 的名稱

 

4、frameborder

規定是否顯示邊框,值為 0(不顯示)和 1(顯示)

 

5、scrolling

規定是否在 iframe 中顯示滾動條,值為 yes、no、auto

 

6、src

設置 iframe 的地址(頁面/圖片)

 

7、srcdoc

用來替換 iframe 中 html、body 里的內容( IE 不支持)

 

8、sandbox

對 iframe 進行內容限制,值為

  • allow-forms
  • allow-same-origin
  • allow-scripts
  • allow-top-navigation
  • ...

支持 IE10+

 

 

三、獲取 iframe 中的內容

 

1、獲取 iframe

var iframe = document.getElementById("iframe1");

 

2、iframe.contentWindow

獲取iframe的window對象

var iwindow = iframe.contentWindow;


3、iframe.contentDocument

獲取iframe的document對象

var idoc = iwindow.document;

 

4、window.frames['name']

這種方法同樣可以獲取 window 對象

var iwindow = window.frames['name'];

 

 

四、在 iframe 中獲取父級內容

 

1、window.parent

獲取上一級 window 對象( iframe 可以有多層使用)

 

2、window.top

獲取最頂級容器的 window 對象,即打開頁面時的文檔

 

3、window.self

返回自身 window 對象

 

 

五、iframe 的長輪詢 

 

長輪詢就是在 ajax 的 readyState = 4的時,再次執行原函數。

這裡使用 iframe 也是一樣,非同步創建 iframe,然後 reload

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 - 廣告嵌入

廣告通常與原文無關,如果直接在某個 div 下嵌套,會造成網頁佈局的紊亂,而且還需要引入額外的 css 和 js 文件,極大降低了網頁的安全性。 這些所有的弊端,都可以使用iframe進行解決。 
可以將 iframe 理解為一個沙盒,裡面的內容能夠被 top window 完全控制,而且,主頁的 css 樣式不會入侵 iframe 裡面的樣式

預設情況下,iframe 會自帶滾動條,不會全屏,如果你想自適應iframe的話:


1、去掉滾動條

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

 

2、設置 iframe 的高為 body 的高

var iwindow = iframe.contentWindow;
var idoc = iwindow.document;
iframe.height = idoc.body.offsetHeight;

另外,還可以添加其它的裝飾屬性:

屬性效果
allowtransparency true or false
是否允許iframe設置為透明,預設為false
allowfullscreen true or false
是否允許iframe全屏,預設為false

 

 

 

 

 

 

七、iframe 的安全性

 

1、防嵌套網頁

iframe 享有 click 優先權,當有人在偽造的主頁中進行點擊的話,如果點在 iframe 上,則會預設是在操作 iframe 的頁面。 所以,釣魚網站就是使用這個技術,通過誘導用戶進行點擊。
為了防止網站被釣魚,可以使用 window.top 來防止你的網頁被 iframe,即限定你的網頁不能被嵌套在任何網頁內:

//iframe2.html
if(window != window.top){
    window.top.location.href = correctURL;
}

 

2、X-Frame-Options

X-Frame-Options 是一個相應頭,主要是描述伺服器的網頁資源的 iframe 許可權,有3個選項:

  1. DENY:當前頁面不能被嵌套 iframe 里,即便是在相同功能變數名稱的頁面中嵌套也不允許,也不允許網頁中有嵌套 iframe
  2. SAMEORIGIN:iframe 頁面的地址只能為同源功能變數名稱下的頁面
  3. ALLOW-FROM:可以在指定的 origin url 的 iframe 中載入

簡單實例:

X-Frame-Options: DENY
拒絕任何iframe的嵌套請求

X-Frame-Options: SAMEORIGIN
只允許同源請求,例如網頁為 foo.com/123.php,則 foo.com 底下的所有網頁可以嵌入此網頁,但是 foo.com 以外的網頁不能嵌入

X-Frame-Options: ALLOW-FROM http://s3131212.com
只允許指定網頁的iframe請求,不過相容性較差Chrome不支持

X-Frame-Options 其實就是將前端 js 對 iframe 的把控交給伺服器來進行處理

//js
if(window != window.top){
    window.top.location.href = window.location.href;
}
//等價於
X-Frame-Options: DENY

//js
if (top.location.hostname != window.location.hostname) { 
    top.location.href =window.location.href;
}
//等價於
X-Frame-Options: SAMEORIGIN

該屬性是對頁面的 iframe 進行一個主要限制,不過,涉及 iframe 的 header 可不止這一個,另外還有一個 Content Security Policy,同樣也可以對 iframe 進行限制

 

3、sandbox

sandbox 就是用來給指定 iframe 設置一個沙盒模型限制 iframe 的更多許可權
sandbox 是 h5 的一個新屬性,IE10+支持
啟用方式就是使用 sandbox 屬性:

<iframe sandbox src=”...”></iframe>

這樣會對iframe頁面進行一系列的限制:

  1. script 腳本不能執行
  2. 不能發送 ajax 請求
  3. 不能使用本地存儲,即 localStorage,cookie 等
  4. 不能創建新的彈窗和 window
  5. 不能發送表單
  6. 不能載入額外插件比如 flash 等

同時可以放寬一點許可權。在 sandbox 裡面進行一些簡單設置

<iframe sandbox=”allow-same-origin” src=”...”></iframe>

常用的配置項有:

配置效果
allow-forms 允許進行提交表單
allow-scripts 運行執行腳本
allow-same-origin 允許同域請求,比如 ajax,storage
allow-top-navigation 允許 iframe 能夠主導 window.top 進行頁面跳轉
allow-popups 允許 iframe 中彈出新視窗,比如 window.open,target="_blank"
allow-pointer-lock 在 iframe 中可以鎖定滑鼠,主要和滑鼠鎖定有關

 

 

 

 

 

 

可以通過在 sandbox 里,添加允許進行的許可權.

<iframe sandbox=”allow-forms allow-same-origin allow-scripts” src=”...”></iframe>

這樣可以保證 js 腳本的執行,但是禁止 iframe 里的 javascript 執行 top.location = self.location

 

 

八、iframe 的局限

 

1、創建比一般的 DOM 元素慢了 1-2 個數量級

iframe 的創建比其它包括 scripts 和 css 的 DOM 元素的創建慢了 1-2 個數量級,使用 iframe 的頁面一般不會包含太多 iframe,所以創建 DOM 節點所花費的時間不會占很大的比重。但帶來一些其它的問題:onload 事件以及連接池(connection pool)

 

2、阻塞頁面載入

及時觸發 window 的 onload 事件是非常重要的。onload 事件觸發使瀏覽器的 “忙” 指示器停止,告訴用戶當前網頁已經載入完畢。當 onload 事件載入延遲後,它給用戶的感覺就是這個網頁非常慢。

window 的 onload 事件需要在所有 iframe 載入完畢後(包含裡面的元素)才會觸發。在 Safari 和 Chrome 里,通過 JavaScript 動態設置 iframe 的 SRC 可以避免這種阻塞情況

 

3、唯一的連接池

瀏覽器只能開少量的連接到 web 伺服器。比較老的瀏覽器,包含 Internet Explorer 6 & 7 和 Firefox 2,只能對一個功能變數名稱(hostname)同時打開兩個連接。這個數量的限制在新版本的瀏覽器中有所提高。Safari 3+ 和 Opera 9+ 可同時對一個功能變數名稱打開 4 個連接,Chrome 1+, IE 8 以及 Firefox 3 可以同時打開 6 個

絕大部分瀏覽器,主頁面和其中的 iframe 是共用這些連接的。這意味著 iframe 在載入資源時可能用光了所有的可用連接,從而阻塞了主頁面資源的載入。如果 iframe 中的內容比主頁面的內容更重要,這當然是很好的。但通常情況下,iframe 里的內容是沒有主頁面的內容重要的。這時 iframe 中用光了可用的連接就是不值得的了。一種解決辦法是,在主頁面上重要的元素載入完畢後,再動態設置 iframe 的 SRC。

 

4、不利於 SEO

搜索引擎的檢索程式無法解讀 iframe。另外,iframe 本身不是動態語言,樣式和腳本都需要額外導入。綜上,iframe 應謹慎使用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name= ...
  • 一、DOM 事件模型 DOM 事件模型包括捕獲和冒泡,捕獲是從上往下到達目標元素,冒泡是從當前元素,也就是目標元素往上到 window 二、流 流的概念,在現今的 JavaScript 中隨處可見。比如說 React 中的單向數據流,Node 中的流,還有 DOM 事件流,都是流的一種生動體現。至於 ...
  • 原碼,項目中遇到的錯誤,解決方法,文章最後有鏈接可以獲取 項目簡介 功能描述 登陸,註冊,用戶一覽表,修改,刪除,添加,模糊查詢和精確查詢 採用的技術及環境 JSP:前端的信息展示 Servlet:業務邏輯功能實現,及調用資料庫的實現數據處理和傳輸 MySQL:用來實現數據存儲 利用Eclipse來 ...
  • 最近博客背景圖片的外鏈掛了,沒辦法,只好另找辦法。 在博客園後臺,有一個“文件”菜單,可以上傳自己的文件,我就打算把圖片傳到裡面。但卻發現了一個很反人性的設置:不允許上傳jpg,png文件,允許上傳的只有bmp,gif這樣的圖片文件。bmp文件太大,載入都要好幾秒,gif文件質量太差,只有256色, ...
  • 編程思想: 面向過程:凡事親力親為,所有事情的過程都要清楚,註重的是過程。 面向對象:提出需求,找到對象,對象解決這個問題,我們要結果,註重的是結果。 面向對象的特性:封裝,繼承,多態; JS: 是一門解釋性語言,是一門腳本語言,是一門弱類型語言,是一門基於對象的語言,是一門動態類型的語言。 對象: ...
  • 一、React的世界觀1、通過改變state來改變視圖視圖不用考慮如何改變自己,把state畫出來即可。2、變數不可變通過創建一個新的state來更改state,使得變更可追蹤,不容易因為其他部分修改state導致不可預測的錯誤3、結構與樣式分離參考了CSS的做法,RN的style機制使得代碼更清晰 ...
  • js中的數組和字元串有點類似,不是說本質上,而是在遍歷,獲取時的類似。從標識來說,可以一眼看出那個是數組,那個是字元串;但在使用遍歷時,會不經意的將兩者混淆,導致方法用錯。同時兩者的方法又有好幾個相同的,但需註意語義,以及有些方法是不會對原數組產生影響的。以下是我整理的一些關於數組和字元串的一些方法 ...
  • 介紹 在css2當中,存在標準模式下的盒子模型和IE下的怪異盒子模型。這兩種方案表示的是一種盒子模型的渲染模式。而在css3當中,新增加了彈性盒子模型,彈性盒子模型是一種新增加的強大的、靈活的佈局方案。彈性盒子模型是css3中新提出的一種佈局方案。是一種為了應對針對不同屏幕寬度不同設備的一整套新的布 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...