iframe載入完成時的事件監聽


經常會遇到這樣一種情況。
在iframe里嵌入另外一個頁面時。如果iframe載入的頁面響應較快,或許我們感覺不到頁面載入的不同步,但試想,如果一個需要內嵌到iframe里的頁面的響應很慢,這里會出現一種什么現象呢?這時將會出現所有頁面已經載入完成,但在iframe元素處,將會出現空白,直到內嵌頁面完成載入時,該空白處才會顯示新載入的頁面。
可想而知,一個頁面如果長時間的空白,對於瀏覽者來說將意味着什么。
如果在內嵌頁面未載入完成時,給出一種加載提示信息。如:“頁面加載中”之類的,我想這對瀏覽頁面用戶來講,將不再是煎熬,更是一種視覺上的享受。
為了實現這樣的效果,一般會采用如下原理處理。
·iframe載入區域給出友好的提示信息。
·當iframe載入完成時,清空提示信息,而讓iframe顯示。
這些都比較容易,但現在的問題的關鍵是怎么監聽iframe元素內的頁面已經載入完成。
關鍵這個問題,一般來講,會分兩種情況的來討論解決方案。
·同域的嵌套。最好是讓子頁面調用父頁面的方法。
·如果是異域,但子頁面無法修改,那么:在Firefox/Opera/Safari中,可以直接使用iframe onload事件;而在IE中,可以通過定時器測定子頁面的document.readyState,或者使用iframe onreadystatechange事件計算該事件的響應。
1.同域嵌套。
parent.html

function ifrmLoaded() {
	// code here
}

sub.html

window.onload = function() {
	window.parent.ifrmLoaded();
}

有時候,為了防止自己的頁面不被別人嵌套,可以采用如下方式解決:

if(window.parent!=window) window.parent.location="http://hqlong.com";
//or
if(window.top!=window) window.top.location="http://hqlong.com";

2.嵌套頁面不能修改,或者異域嵌套。
2.1 Firefox/Opera/Safari中直接使用iframe onload事件

document.getElementById('ifrm').onload = function() {
	//here doc
}

2.2 在IE下,定時器測document.readyState或者注冊iframe onreadystatechange事件
2.2.1 使用定時器

var oFrm = document.getElementById('ifrm');
var fmState=function(){
	var state=null;
	if(document.readyState){
		try{
			state=oFrm.document.readyState;
		}catch(e){state=null;}
		if(state=="complete" || !state) {
			onComplete();
			return;
		}
		window.setTimeout(fmState,10);
	}
};
//在改變src或者通過form target提交表單時,執行語句:
if(fmState.TimeoutInt) window.clearTimeout(fmState.timeoutInt);
fmState.timeoutInt = window.setTimeout(fmState,400);

2.2.2 使用iframe onreadystatechange事件

var oFrm = document.getElementById('ifrm');
oFrm.onreadystatechange = function() {
	if (this.readyState && this.readyState == 'complete') {
		onComplete();
	}
}

每當iframe加載頁面,過程內會激活onreadystatechange事件三次,相應的狀態分別是loading,interactive和complete,而最后一次才是complete.
3. 兼容Firefox/Opera/Safari/IE的處理方式。

var oFrm = document.getElementById('ifrm');
oFrm.onload = oFrm.onreadystatechange = function() {
     if (this.readyState && this.readyState != 'complete') return;
     else {
         onComplete();
     }
}

引用:http://www.cnblogs.com/chencidi/archive/2011/03/29/1999129.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM