先決條件: | 基本計(jì)算機(jī)知識,安裝的基本軟件,基本知識 developer.mozilla.org/zh-CN/Learn/Getting_started_with_the_web/Dealing_with_files\">使用文件工作,熟悉HTML基礎(chǔ)知識(如 HTML入門教程中所述) )和本模塊中的上一篇文章。 |
---|---|
目的: | To learn how to embed items into web pages using <object> ,?<embed> , and <iframe> , like Flash movies and other webpages. |
很久以前,在網(wǎng)絡(luò)上,很受歡迎的是使用框架來創(chuàng)建網(wǎng)站 - 網(wǎng)站的小部分存儲在各個(gè)HTML頁面中。 這些內(nèi)嵌在稱為框架集的主文檔中,這允許您指定屏幕上每個(gè)框架填充的區(qū)域,而不是像調(diào)整表格的列和行一樣。 這些被認(rèn)為是90年代中后期的冷靜程度,有證據(jù)表明,將網(wǎng)頁拆分成更小的塊,這樣更適合下載速度 - 尤其是當(dāng)網(wǎng)絡(luò)連接速度很慢時(shí)。 然而,他們有很多問題,遠(yuǎn)遠(yuǎn)超過任何陽性,因?yàn)榫W(wǎng)絡(luò)速度更快,所以你不會看到他們被使用了。
Java Applets\">稍后(90年代后期,21世紀(jì)初),插件技術(shù)變得非常受歡迎,例如 Java Applets and Flash — these allowed web developers to embed rich content into webpages such as video and animations\">a>和 Flash - 這些允許網(wǎng)絡(luò)開發(fā)者將豐富的內(nèi)容嵌入到網(wǎng)頁(如視頻和動(dòng)畫)中,這只是不能通過單獨(dú)的HTML。嵌入這些技術(shù)是通過<object>
, and the lesser-used?外部資源,其可以被視為圖像,嵌套瀏覽上下文或要由插件處理的資源。"> < object>
, a title ="HTML嵌入元素表示外部應(yīng)用程序或交互式內(nèi)容的集成點(diǎn)(換句話說, <embed>
, and they were very useful at the time.\">,插件)。"> < embed>
,它們在當(dāng)時(shí)非常有用。由于許多問題,包括可訪問性,安全性,文件大小等等,它們已經(jīng)脫離了時(shí)尚;這些天大多數(shù)移動(dòng)設(shè)備不再支持這樣的插件,桌面支持正在出路。
Java Applets\">稍后(90年代后期,21世紀(jì)初),插件技術(shù)變得非常受歡迎,例如 Java Applets and Flash — these allowed web developers to embed rich content into webpages such as video and animations\">a>和 Flash - 這些允許網(wǎng)絡(luò)開發(fā)者將豐富的內(nèi)容嵌入到網(wǎng)頁(如視頻和動(dòng)畫)中,這只是不能通過單獨(dú)的HTML。嵌入這些技術(shù)是通過<object>
, and the lesser-used?外部資源,其可以被視為圖像,嵌套瀏覽上下文或要由插件處理的資源。"> < object>
, a title ="HTML嵌入元素表示外部應(yīng)用程序或交互式內(nèi)容的集成點(diǎn)(換句話說, <embed>
, and they were very useful at the time.\">,插件)。"> < embed>
,它們在當(dāng)時(shí)非常有用。由于許多問題,包括可訪問性,安全性,文件大小等等,它們已經(jīng)脫離了時(shí)尚;這些天大多數(shù)移動(dòng)設(shè)備不再支持這樣的插件,桌面支持正在出路。
有了歷史課程,讓我們繼續(xù),看看如何使用其中的一些。
在本文中,我們將直接跳轉(zhuǎn)到一個(gè)積極的學(xué)習(xí)部分,立即給你一個(gè)真正的想法,嵌入技術(shù)是有用的。Youtube, but many people don\'t know about some of the sharing facilities it has available\">在線世界非常熟悉 Youtube ,但很多人不知道一些共享設(shè)施。讓我們看看YouTube如何允許我們使用HTML內(nèi)聯(lián)框架元素(iframe)表示嵌套的瀏覽上下文,有效地將另一個(gè)HTML頁面嵌入到當(dāng)前頁面中。在HTML 4.01中,文檔可以包含頭部和正文或頭部和框架集,但不能同時(shí)包含正文和然而,可以在正常文檔主體內(nèi)使用iframe,每個(gè)瀏覽上下文具有其自己的會話歷史和活動(dòng)文檔,包含嵌入內(nèi)容的瀏覽上下文稱為父瀏覽上下文,頂層瀏覽上下文<iframe>
.\">沒有父級)通常是瀏覽器窗口。"> < iframe>
。
<iframe>
code — copy this.對于獎(jiǎng)勵(lì)積分,您還可以嘗試在示例中嵌入 Google地圖:
<iframe>
code — copy this.如果發(fā)生錯(cuò)誤,您可以隨時(shí)使用重置按鈕重置。 如果您遇到問題,請按顯示解決方案按鈕查看答案。
<h2>Input</h2> <textarea id="code" class="input"> </textarea> <h2>Output</h2> <div class="output"></div> <div class="controls"> ? <input id="reset" type="button" value="Reset" /> <input id="solution" type="button" value="Show solution" /> </div>
body { font-family: 'Open Sans Light',Helvetica,Arial,sans-serif; } .input, .output { width: 90%; height: 10em; padding: 10px; border: 1px solid #0095dd; overflow: auto; } .output { height: 14em; } button { padding: 10px 10px 10px 0; }
var textarea = document.getElementById("code"); var reset = document.getElementById("reset"); var code = textarea.value; var output = document.querySelector(".output"); var solution = document.getElementById("solution"); function drawOutput() { output.innerHTML = textarea.value; } reset.addEventListener("click", function() { textarea.value = code; drawOutput(); }); solution.addEventListener("click", function() { textarea.value = '<iframe width="420" height="315" src="https://www.youtube.com/embed/QH2-TGUlwu4" rel="external nofollow" frameborder="0" allowfullscreen>\n</iframe>'; drawOutput(); }); textarea.addEventListener("input", drawOutput); window.addEventListener("load", drawOutput);
所以,這是容易和樂趣嗎? 頁面到當(dāng)前頁面在HTML 4.01中,文檔可能包含一個(gè)頭部和一個(gè)主體或一個(gè)頭部和一個(gè)框架集,但不能同時(shí)包含一個(gè)主體和一個(gè)框架集,但是一個(gè)iframe可以在一個(gè)正常的文檔主體中使用,<\">上下文具有其自己的會話歷史和活動(dòng)文檔,包含嵌入內(nèi)容的瀏覽上下文被稱為父瀏覽上下文。頂層瀏覽上下文(其沒有父)通常是瀏覽器窗口">
elements are designed to allow you to embed other web documents into the current document.\">iframe> 元素旨在允許您將其他Web文檔嵌入到當(dāng)前文檔中。這非常適合將第三方內(nèi)容整合到您的網(wǎng)站中,而您可能無法直接控制,也不想實(shí)施自己的版本(例如來自在線視頻提供商的視頻),注釋系統(tǒng)(例如Disqus, maps from online map providers, advertising banners, etc. The live editable examples you\'ve been using through this course are implemented using
<\">://disqus.com/"class ="external"> Disqus ,來自在線地圖提供商的地圖,廣告橫幅等。您通過本課程使用的現(xiàn)場可編輯示例是使用
s.\">; iframe> 。<
有一些嚴(yán)重的安全問題需要考慮使用< iframe>
,我們將在下面討論,但這并不意味著 不應(yīng)該在你的網(wǎng)站中使用它 - 它只需要一些知識和仔細(xì)的思考。 讓我們更詳細(xì)地探討代碼。 假設(shè)您想在其中一個(gè)網(wǎng)頁上加入MDN詞匯表,您可以嘗試這樣做:
<iframe src="https://developer.mozilla.org/en-US/docs/Glossary" rel="external nofollow" width="100%" height="500" frameborder="0" allowfullscreen sandbox> <p> <a rel="external nofollow" target="_blank" > Fallback link for browsers that don't support iframes </a> </p> </iframe>
此示例包括使用< iframe>
所需的基本要素:
allowfullscreen
<iframe>
is able to be placed in fullscreen mode using the Full Screen API (somewhat beyond scope for this article.)frameborder
border
: none;
in your CSS.src
<video>
/<img>
, contains a path pointing to the URL of the document to be embedded.width
and height
<video>
, you can include fallback content between the opening and closing <iframe></iframe>
tags that will appear if the browser doesn't support the <iframe>
. In this case we have included a link to the page instead. It is unlikely that you'll come across any browser that doesn't support <iframe>
s these days.sandbox
<iframe>
features (e.g. IE 10 and above) requests heightened security settings; we'll say more about this in the next section.注意:為了提高速度,在主內(nèi)容加載完成后,最好使用JavaScript設(shè)置iframe的 src
屬性。 這可以讓您的網(wǎng)頁更早使用,并減少您的官方網(wǎng)頁加載時(shí)間(一個(gè)重要的 :SEO(搜索引擎優(yōu)化)是使網(wǎng)站在搜索結(jié)果中更可見的過程,也稱為改進(jìn)搜索排名。"> SEO 指標(biāo)。)
上面我們提到安全問題 - 讓我們現(xiàn)在更詳細(xì)地介紹一下。 我們不期望你第一次完全理解所有這些內(nèi)容; 我們只是想讓你知道這個(gè)問題,并提供一個(gè)參考,當(dāng)你得到更多的經(jīng)驗(yàn),并開始考慮使用< iframe>
在你的實(shí)驗(yàn)和工作回來。 此外,沒有必要害怕,不使用< iframe>
- 你只需要小心。 閱讀...
瀏覽器制造商和Web開發(fā)人員已經(jīng)了解到iframe是網(wǎng)絡(luò)上的壞人(通常稱為黑客或更多)的常見目標(biāo)(官方術(shù)語:攻擊向量 準(zhǔn)確地,餅干)攻擊,如果他們試圖惡意修改您的網(wǎng)頁,或誘騙人們做他們不想做的事情,如揭露敏感信息,如用戶名和密碼。 因此,規(guī)格工程師和瀏覽器開發(fā)人員已經(jīng)開發(fā)了各種安全機(jī)制,使< iframe>
更安全,還有一些最佳做法需要考慮 - 我們將在下面介紹其中的一些。
Clickjacking 是一種常見的iframe攻擊,黑客會將不可見的iframe嵌入您的 文檔(或?qū)⒛奈臋n嵌入到自己的惡意網(wǎng)站),并使用它捕獲用戶的交互。 這是誤導(dǎo)用戶或竊取敏感數(shù)據(jù)的常見方式。
Clickjacking 是一種常見的iframe攻擊,黑客會將不可見的iframe嵌入您的 文檔(或?qū)⒛奈臋n嵌入到自己的惡意網(wǎng)站),并使用它捕獲用戶的交互。 這是誤導(dǎo)用戶或竊取敏感數(shù)據(jù)的常見方式。
有時(shí),嵌入第三方內(nèi)容(例如YouTube視頻和地圖)是有意義的,但如果您只在完全必要的情況下嵌入第三方內(nèi)容,則可以節(jié)省自己很多頭痛。 對于網(wǎng)絡(luò)安全來說,一個(gè)好的經(jīng)驗(yàn)法則是:"你永遠(yuǎn)不能太謹(jǐn)慎,如果你這樣做了,再仔細(xì)檢查一下,如果別人做,假設(shè)它是危險(xiǎn)的,除非另有證明。"
除了安全性,你還應(yīng)該知道知識產(chǎn)權(quán)問題。 大多數(shù)內(nèi)容都受版權(quán)保護(hù),離線和在線,甚至您可能不希望看到的內(nèi)容(例如, Wikimedia Commons / a>)。 除非您擁有該網(wǎng)頁,否則不要在您的網(wǎng)頁上顯示內(nèi)容,或者所有者已給您書面明確的許可。 對侵犯版權(quán)的處罰十分嚴(yán)厲。 再次,你永遠(yuǎn)不能太謹(jǐn)慎。
如果內(nèi)容獲得許可,您必須遵守許可條款。 例如,MDN上的內(nèi)容是根據(jù)CC-BY-SA授權(quán)的內(nèi)容。 也就是說,即使您進(jìn)行實(shí)質(zhì)性更改,也必須在引用我們的內(nèi)容時(shí)正確告知我們。
通常使用SSL或TLS加密客戶端和服務(wù)器之間的所有通信,這種安全連接允許客戶端安全地與服務(wù)器交換敏感數(shù)據(jù),例如用于銀行活動(dòng)或在線購物。"> HTTPS 是加密版本 of HTTP是文本的(所有通信都是以純文本形式進(jìn)行的)和無狀態(tài)的(沒有通信知道以前的通信)。 您應(yīng)該盡可能使用HTTPS為您的網(wǎng)站提供服務(wù):
使用HTTPS需要安全證書,這可能很昂貴(雖然讓我們加密使事情更容易) - 如果你不能得到 一個(gè),您可以使用HTTP提供您的父文檔。 然而,由于上述HTTPS的第二個(gè)好處,無論成本多少,您絕不能使用HTTP嵌入第三方內(nèi)容。 (在最佳情況下,您的用戶的Web瀏覽器會給他們一個(gè)可怕的警告。)所有信譽(yù)良好的公司,通過< iframe>
HTTPS - 例如,當(dāng)您嵌入Google地圖或Youtube中的內(nèi)容時(shí),請查看< iframe>
src
屬性中的網(wǎng)址。
注意: Github網(wǎng)頁允許在默認(rèn)情況下通過HTTPS投放內(nèi)容,因此對托管內(nèi)容很有用。 如果您使用不同的主機(jī),但不確定,請向您的托管服務(wù)提供商咨詢。
sandbox
attribute你希望攻擊者在你的網(wǎng)站上給予攻擊者的力量不大,因此你應(yīng)該給嵌入的內(nèi)容只有執(zhí)行其工作所需的權(quán)限。 當(dāng)然,這也適用于您自己的內(nèi)容。 一個(gè)代碼容器,它可以被正確地使用或者用于測試,但不會對代碼庫的其他部分(意外或惡意)造成任何損害,被稱為 org / wiki / Sandbox_(computer_security)"class ="external"> sandbox 。
未經(jīng)過消毒處理的內(nèi)容可能做的太多(執(zhí)行JavaScript,提交表單,彈出窗口等)默認(rèn)情況下,您應(yīng)該通過使用沒有參數(shù)的 sandbox
屬性強(qiáng)加所有可用的限制,如我們前面的示例 。
如果絕對需要,您可以逐個(gè)添加權(quán)限(在 sandbox =""
屬性值內(nèi)) - 請參閱 zh-CN / docs / Web / HTML / Element / iframe#attr-sandbox"> sandbox
所有可用選項(xiàng)的參考條目。 一個(gè)重要的注意事項(xiàng)是,您應(yīng)該從沙盒
中添加 allow-scripts
和 allow-same-origin
屬性 - 在這種情況下,嵌入內(nèi)容可能繞過相同的源安全策略,阻止網(wǎng)站執(zhí)行腳本,并使用JavaScript完全關(guān)閉沙盒。
注意:如果攻擊者可以直接欺騙用戶訪問惡意內(nèi)容( iframe
之外),則沙箱無法提供保護(hù)。 如果某些內(nèi)容可能是惡意的(例如,用戶生成的內(nèi)容),請從不同的 class ="glossaryLink"title ="domain:域是計(jì)算機(jī)網(wǎng)絡(luò)的一部分,其中一個(gè)實(shí)體控制數(shù)據(jù)處理資源,例如網(wǎng)站">域到您的主站點(diǎn)。
CSP stands for \">的網(wǎng)站相關(guān)攻擊,如XSS和數(shù)據(jù)注入。"> CSP 代表 , and provides a set of HTTP Headers內(nèi)容安全政策 ,并提供一組HTTP標(biāo)頭 (metadata sent along with your web pages when they are served from a web server) designed to improve the security of your HTML document.\">/ a>(當(dāng)您的網(wǎng)頁從網(wǎng)絡(luò)服務(wù)器提供時(shí),與您的網(wǎng)頁一起發(fā)送的元數(shù)據(jù)),旨在提高HTML文檔的安全性。<iframe>s, you can 在確保< iframe>
的安全性時(shí),您可以 configure your server to send an appropriate X-Frame-Options
? header. This can prevent other websites from embedding your content in their webpages (which would enable\">框架選項(xiàng)">配置您的服務(wù)器以發(fā)送適當(dāng)?shù)?code> X-Frame-Options 標(biāo)題。 這可以防止其他網(wǎng)站將您的內(nèi)容嵌入其網(wǎng)頁clickjacking and a host of other attacks), which is exactly what the MDN developers\">點(diǎn)擊劫持和一系列其他攻擊),這正是MDN開發(fā)人員已經(jīng)做了,正如我們前面看到的。
注意:您可以閱讀Frederik Braun的帖子 header /"class ="external">關(guān)于X-Frame-Options安全報(bào)頭,以獲取有關(guān)此主題的更多背景信息。 顯然,在本文中完全解釋的范圍之外。
注意:您可以閱讀Frederik Braun的帖子 header /"class ="external">關(guān)于X-Frame-Options安全報(bào)頭,以獲取有關(guān)此主題的更多背景信息。 顯然,在本文中完全解釋的范圍之外。
注意:插件是一種軟件,它提供對瀏覽器無法讀取的內(nèi)容的訪問權(quán)限。
但是,您不太可能非常使用這些元素 - Applet已經(jīng)使用多年,F(xiàn)lash不再受歡迎,由于多種原因(請參閱針對插件的情況 / a>,下面),PDF往往比嵌入更好的鏈接,而其他內(nèi)容,如圖像和視頻有更好,更容易的元素來處理這些。 插件和這些嵌入方法真的是一種遺留的技術(shù),我們主要提到它們,以防在某些情況下遇到它們,例如內(nèi)聯(lián)網(wǎng)或企業(yè)項(xiàng)目。
如果你發(fā)現(xiàn)自己需要嵌入插件內(nèi)容,這是至少需要的那種信息:
<embed> | <object> | |
---|---|---|
在互聯(lián)網(wǎng)上找到。"> URL 嵌入內(nèi)容 | src | data |
準(zhǔn)確 稱為"媒體類型",有時(shí)也稱為"內(nèi)容類型")是與指示文件類型的文件一起發(fā)送的字符串(例如,聲音文件可以標(biāo)記為audio / ogg或圖像文件圖像/ png)。 它的作用與文件擴(kuò)展名傳統(tǒng)上在嵌入式內(nèi)容的Windows。\'媒體類型上相同 | type | type |
由插件控制的框的高度和寬度(以CSS像素為單位) |
height width
|
height width
|
名稱和值,以作為參數(shù)饋送插件 | 具有這些名稱和值的ad hoc屬性 | single-tag <param> elements, contained within <object>
|
獨(dú)立的HTML內(nèi)容作為不可用資源的后備 | not supported (<noembed> is obsolete) | contained within <object> , after <param> elements |
注意:< object>
需要 data
屬性, type
屬性, 如果同時(shí)使用兩者,您還可以使用 typemustmatch
a> 屬性(僅在Firefox中實(shí)現(xiàn),從本文開始)。 typemustmatch
保持嵌入式文件不運(yùn)行,除非 type
屬性提供正確的媒體類型。 typemustmatch
因此可以在您嵌入來自不同 "glossaryLink"title ="origin:Web內(nèi)容的來源由方案(協(xié)議),主機(jī)(域)和用于訪問它的URL的端口定義。只有當(dāng)方案,主機(jī)和端口 所有匹配。"> origin (它可以防止攻擊者通過插件運(yùn)行任意腳本)。
以下是使用 或交互式內(nèi)容(換句話說,插件)。"> < embed>
元素嵌入Flash電影(請參閱此 .github.io / learning-area / html / multimedia-and-embedding / other-embedding-technologies / embed-flash.html"class ="external">在Github上生活,以及 ://github.com/mdn/learning-area/blob/gh-pages/html/multimedia-and-embedding/other-embedding-technologies/embed-flash.html"class ="external">檢查源代碼 / a>):
<embed src="whoosh.swf" quality="medium" bgcolor="#ffffff" width="550" height="400" name="whoosh" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
很可怕,不是。 由Adobe Flash工具生成的HTML往往更糟,使用嵌入了< embed>
元素的< object>
元素覆蓋所有基 (檢查一個(gè)例子。)Flash甚至成功地用作HTML5視頻的后備內(nèi)容,一段時(shí)間,但是這越來越被視為沒有必要。
現(xiàn)在讓我們看看將PDF嵌入頁面的< object>
示例(參見 and-embedding / other-embedding-technologies / object-pdf.html"class ="external"> live example 和 /gh-pages/html/multimedia-and-embedding/other-embedding-technologies/object-pdf.html"class ="external">源代碼):
<object data="mypdf.pdf" type="application/pdf" width="800" height="1200" typemustmatch> <p>You don't have a PDF plugin, but you can <a href="myfile.pdf">download the PDF file.</a></p> </object>
PDF是紙質(zhì)和數(shù)字之間必要的墊腳石,但它們構(gòu)成了許多輔助功能挑戰(zhàn),可能很難 在小屏幕上閱讀。 他們?nèi)匀粌A向于在某些圈子受歡迎,但它是更好地鏈接到他們,所以他們可以下載或閱讀在一個(gè)單獨(dú)的頁面,而不是嵌入在網(wǎng)頁。
過去,插件在Web上是不可或缺的。 記住你必須安裝Adobe Flash Player才能在線觀看電影的日子? 然后你總是有關(guān)于更新Flash Player和你的Java運(yùn)行時(shí)環(huán)境煩人的警報(bào)。 網(wǎng)絡(luò)技術(shù)從此變得更加強(qiáng)大,那些日子已經(jīng)結(jié)束了。 對于大多數(shù)應(yīng)用程序,現(xiàn)在是停止提供依賴于插件的內(nèi)容的時(shí)候了,并開始利用Web技術(shù)。
那么你該怎么辦呢?如果您需要交互性,HTML和JavaScript can readily get the job done for you with no need for Java applets or outdated ActiveX/BHO technology.\">客戶端以動(dòng)態(tài)腳本網(wǎng)頁,但通常也在服務(wù)器端。"> JavaScript 可以輕松地為您完成工作,無需Java applet或過時(shí)的ActiveX / BHO技術(shù)。HTML5 video for your media needs, SVG\">您可以使用 HTML5視頻來滿足您的媒體需求,而不是依賴于Adobe Flash, SVG for vector graphics, and Canvas for complex images and animations.\">a>用于矢量圖形,以及 Canvas 用于復(fù)雜的圖像和動(dòng)畫。 Peter Elst was already writing some years ago that Adobe Flash is rarely the right tool for the\"> Peter Elst已在幾年前撰寫,Adobe Flash很少是適用于工作,除了專門的游戲和商業(yè)應(yīng)用程序。對于ActiveX,即使是Microsoft的Edge browser no longer supports it.\">圖形Web瀏覽器與Microsoft Windows捆綁在一起,自2014年開始由Microsoft開發(fā)。最初稱為Spartan,Edge取代了長期以來的Microsoft瀏覽器Internet Explorer。"> Edge 瀏覽器不再支持它。
在Web文檔中嵌入其他內(nèi)容的主題很快就會變得非常復(fù)雜,因此在本文中,我們試圖以一種簡單而熟悉的方式介紹它,它將立即顯得相關(guān),同時(shí)仍然暗示了一些更高級的功能 涉及技術(shù)。 首先,您不太可能使用嵌入功能,包括第三方內(nèi)容(例如您網(wǎng)頁上的地圖和視頻)。 當(dāng)你變得更有經(jīng)驗(yàn)的時(shí)候,你很可能開始為他們找到更多的用途。
在Web文檔中嵌入其他內(nèi)容的主題很快就會變得非常復(fù)雜,因此在本文中,我們試圖以一種簡單而熟悉的方式介紹它,它將立即顯得相關(guān),同時(shí)仍然暗示了一些更高級的功能 涉及技術(shù)。 首先,您不太可能使用嵌入功能,包括第三方內(nèi)容(例如您網(wǎng)頁上的地圖和視頻)。 當(dāng)你變得更有經(jīng)驗(yàn)的時(shí)候,你很可能開始為他們找到更多的用途。
更多建議: