HTML5網(wǎng)頁(yè)中iframe與window.onload如何使用詳解
文章主要介紹了iframe與window.onload如何使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。前言在項(xiàng)目上,需要等頁(yè)面加載完之后再執(zhí)行一...
文章主要介紹了iframe與window.onload如何使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
前言
在項(xiàng)目上,需要等頁(yè)面加載完之后再執(zhí)行一個(gè)方法用于修改頁(yè)面的顏色,于是導(dǎo)出都是在使用onload解決,然而這并不能解決我遇到的問(wèn)題,因?yàn)槲野l(fā)現(xiàn),我項(xiàng)目上的頁(yè)面仍然沒(méi)加載,折騰了很久才知道,原來(lái)是因?yàn)轫?xiàng)目使用了很古老的iframe來(lái)操作的,必須等iframe加載完之后才能執(zhí)行方法,原因分析完了,接下來(lái)我再說(shuō)說(shuō),傳統(tǒng)的,原生JS是如何使用onload的。
網(wǎng)上很常見的方法
<script type="text/javascript">
window.onload=function(){
????document.getElementById("bg").style.backgroundColor="#F00";
}
</script>
解釋:window.onload必須等到頁(yè)面內(nèi)包括圖片的所有元素加載完畢后才能執(zhí)行。
還有一種寫法是
<body? οnlοad="loadBody()">
<div ></div>
<script type="text/javascript">
????console.log("load ......? body? javascript? ");
??
????window.onload=function(){
????????console.log("load ......? body window javascript ");
????}
</script>
</body>
解釋:等待body加載完成,就會(huì)執(zhí)行l(wèi)oadBody()方法。在window和dom之后執(zhí)行,總是最后執(zhí)行。這里的onload函數(shù)會(huì)覆蓋window.onload
上述內(nèi)容并不能解決我的問(wèn)題,于是我去查我不是很想用的jQuery的方法:$(document).ready,想著能不能用原生JS實(shí)現(xiàn)該方法
function ready(fn){
?if(document.addEventListener){? //標(biāo)準(zhǔn)瀏覽器
??document.addEventListener('DOMContentLoaded',function(){
???//注銷時(shí)間,避免重復(fù)觸發(fā)
???document.removeEventListener('DOMContentLoaded',arguments.callee,false);
???fn();? //運(yùn)行函數(shù)
??},false);
?}else if(document.attachEvent){? //IE瀏覽器
??document.attachEvent('onreadystatechange',function(){
???if(document.readyState=='complete'){
????document.detachEvent('onreadystatechange',arguments.callee);
????fn();? //函數(shù)運(yùn)行
???}
??});
?}
}
但是我發(fā)現(xiàn)我的項(xiàng)目上并沒(méi)有任何變化,依然不能用在項(xiàng)目上,這我就發(fā)愁了,我突然想到,項(xiàng)目上用的iframe于是就去搜了一下。
什么是iframe
HTML內(nèi)聯(lián)框架元素 (<iframe>) 表示嵌套的browsing context。它能夠?qū)⒘硪粋€(gè)HTML頁(yè)面嵌入到當(dāng)前頁(yè)面中。每個(gè)嵌入的瀏覽上下文(embedded browsing context)都有自己的會(huì)話歷史記錄(session history)和DOM樹。包含嵌入內(nèi)容的瀏覽上下文稱為父級(jí)瀏覽上下文。頂級(jí)瀏覽上下文(沒(méi)有父級(jí))通常是由 Window 對(duì)象表示的瀏覽器窗口。
iframe 的頁(yè)面和父頁(yè)面(parent)是分開的,所以它意味著,這是一個(gè)獨(dú)立的區(qū)域,不受 parent 的 CSS 或者全局的 JavaScript 的影響。
主要優(yōu)勢(shì):
(1)網(wǎng)頁(yè)編輯器(WYSIWYG Online HTML Editor),因?yàn)樗鼈冃枰?reset 自己的 CSS 到自己的標(biāo)準(zhǔn),而不被 parent CSS 的 override。
(2)沙箱隔離。
(3)需要保持獨(dú)立焦點(diǎn)和歷史管理的子窗口,如復(fù)雜的Web應(yīng)用。
缺點(diǎn):
(1)樣式/腳本需要額外鏈入,會(huì)增加請(qǐng)求。
(2)iframe好在能夠把原先的網(wǎng)頁(yè)全部原封不動(dòng)顯示下來(lái),但是如果用在首頁(yè),是搜索引擎最討厭的。
(3)iframe的創(chuàng)建比其它包括scripts和css的 DOM 元素的創(chuàng)建慢了 1-2 個(gè)數(shù)量級(jí)。
(4)iframe會(huì)阻塞主頁(yè)面的Onload事件
好了,說(shuō)了這么多利弊,還是需要看具體項(xiàng)目來(lái)解決項(xiàng)目上的問(wèn)題,那么怎么解決onload呢?
// 頁(yè)面加載時(shí)判斷frameObj是否加載
window.onload = function(){?
?var frameObj= document.getElementById("frameID");
?// 如果已加載則執(zhí)行方法
?if (frameObj.attachEvent){// IE
????????frameObj.attachEvent("onload", function(){
????????????yourfunction();
????????});
????}else {
????????// 非IE
????????frameObj.onload = function(){
????????????yourfunction();
????????};
}};
這段代碼有兩點(diǎn)比較重要,首先是需要使用window.onload并且你需要知道attachEvent方法
寫了這么久的代碼,還是把IE放在了考慮范圍內(nèi),畢竟是Windws 內(nèi)核,不想刪掉就隱藏吧,最近在寫前端代碼的時(shí)候,發(fā)現(xiàn)如果項(xiàng)目本來(lái)沒(méi)有使用jQuery,就一直不使用jQuery,代碼比較整潔,而且加上新出的vue、react都有自己不錯(cuò)的封裝思路,于是我寫習(xí)慣了$這個(gè)dollar符終于可以不用了。
總結(jié)
以前總是很懶得寫前端代碼,寫標(biāo)簽呀寫JS呀,都覺(jué)得又繁瑣又沒(méi)有意思,可能是因?yàn)閷W(xué)校里學(xué)的都是Java、C/C++這種,邏輯性很強(qiáng),于是在前端的學(xué)習(xí)上,就慢了很多,慢了不知道好幾拍。當(dāng)自己想寫一份前后端都很優(yōu)雅,很華麗的代碼的時(shí)候,就發(fā)現(xiàn),只會(huì)后端是不夠的,代碼寫出來(lái)要么很丑,要么前后交互很潦草,于是也就拿不出手了。最近嘔心瀝血寫了一份代碼,還在潤(rùn)色當(dāng)中,而且申請(qǐng)的域名可算是通過(guò)了,這里有一個(gè)大坑,就是,很久之前我在國(guó)內(nèi)進(jìn)行過(guò)備案,當(dāng)時(shí)因?yàn)檫€是學(xué)生,就在學(xué)校所在地申請(qǐng)了備案號(hào),結(jié)果現(xiàn)在想換又覺(jué)得麻煩,于是總是填錯(cuò),今天通知我審核通過(guò)了,下一步就是聯(lián)網(wǎng)備案,聽說(shuō)是又多了一步,慢慢走流程吧!
到此這篇關(guān)于iframe與window.onload如何使用詳解的文章就介紹到這了,更多相關(guān)iframe與window.onload內(nèi)容請(qǐng)搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章
- HTML5中的網(wǎng)絡(luò)存儲(chǔ)實(shí)現(xiàn)方式
- HTML5離線存儲(chǔ)Manifest原理及使用詳解
- HTML5調(diào)用手機(jī)發(fā)短信和打電話功能
- HTML5標(biāo)簽HTMLCollection和NodeList的區(qū)別詳解
- HTML5網(wǎng)頁(yè)body設(shè)置自適應(yīng)全屏示例代碼
- Html5 canvas中width、height和style的寬高區(qū)別詳解
- 一張圖看懂HTML5的前端性能優(yōu)化
- YouTube默認(rèn)HTML5視頻播放技術(shù) 或引發(fā)流媒體視頻終端
HTML5中的網(wǎng)絡(luò)存儲(chǔ)實(shí)現(xiàn)方式
傳統(tǒng)方式使用document.cookie來(lái)進(jìn)行存儲(chǔ),但是由于其存儲(chǔ)的空間只有4KB左右,并且需要復(fù)雜的操作進(jìn)行解析,給發(fā)開者帶來(lái)很多不便,為此,HTML5規(guī)范提出了網(wǎng)絡(luò)存儲(chǔ)的解決方案,本文通過(guò)...
HTML5離線存儲(chǔ)Manifest原理及使用詳解
文章主要介紹了H5離線存儲(chǔ)Manifest原理及使用,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧理解:離線存儲(chǔ)可以將站點(diǎn)的文件儲(chǔ)存在本地,在沒(méi)有網(wǎng)絡(luò)...
HTML5調(diào)用手機(jī)發(fā)短信和打電話功能
文章主要介紹了HTML5調(diào)用手機(jī)發(fā)短信和打電話功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下前言本來(lái)感覺(jué)用H5寫調(diào)用電話撥號(hào)功能和發(fā)送短信功能會(huì)很不好寫...
HTML5標(biāo)簽HTMLCollection和NodeList的區(qū)別詳解
文章主要介紹了HTML5中的HTMLCollection和NodeList的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧HTML5 HTMLCollection和NodeList的...
HTML5網(wǎng)頁(yè)body設(shè)置自適應(yīng)全屏示例代碼
文章主要介紹了HTML5 body設(shè)置自適應(yīng)全屏,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧用什么代碼實(shí)現(xiàn)?不允許有白色底色產(chǎn)生,因?yàn)槭謾C(jī)高度不一...
Html5 canvas中width、height和style的寬高區(qū)別詳解
文章主要給大家介紹了關(guān)于H5 canvas中width、height和style的寬高區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們...
一張圖看懂HTML5的前端性能優(yōu)化
最近1個(gè)月一直在設(shè)計(jì)HTML5相關(guān)的產(chǎn)品,沒(méi)錯(cuò),主要是用于微信的,雖然很多情況下,HTML5頁(yè)面的設(shè)計(jì)類似于APP,但是由于是網(wǎng)頁(yè)性的東西,對(duì)移動(dòng)網(wǎng)絡(luò)帶寬和瀏覽器性能,CPU,GP...
YouTube默認(rèn)HTML5視頻播放技術(shù) 或引發(fā)流媒體視頻終端升級(jí)風(fēng)暴
近日,YouTube工程總監(jiān)RichardLeider發(fā)文寫道,在Chrome、IE11、Safari8和beta版Firefox瀏覽器中,YouTube已默認(rèn)采用HTML5技術(shù)播放視頻。
他說(shuō),4年前YouTube開始嘗試HTML5技術(shù),當(dāng)...