經常會遇到這樣一種情況。
在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