`

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://hqlong.com/2009/02/620.html
分享到:
评论

相关推荐

    基于JS判断iframe是否加载成功的方法(多种浏览器)

    `onreadystatechange`事件会在`iframe`内容发生变化时触发,包括加载中(`loading`)、加载完成(`loaded`)以及加载成功(`complete`)。我们需要结合`iframe`的`readyState`属性来判断是否已完全加载。以下是一个...

    点击按钮后 框架内载入不同网页内容特效.rar

    JavaScript是一种广泛用于网页开发的客户端脚本语言,它可以操作DOM(Document Object Model),实现与用户的交互,如监听事件(如按钮点击)、改变HTML元素内容、发送Ajax请求等。在这个特效中,JavaScript是核心...

    jsp页面不同frame间调用

    然后,父页面需要监听`message`事件来接收`iframe`发送的数据: ```javascript window.addEventListener('message', function(event) { if (event.origin !== 'http://example.com') return; // 验证来源以防跨站...

    点击按钮后 框架内载入不同网页内容特效特效代码

    当用户点击按钮时,一个事件处理器会被调用,这个处理器通常会修改`<iframe>`的`src`属性,从而改变显示的内容。例如: ```html 加载新页面 <iframe id="contentFrame" src="初始页面URL"></iframe> document....

    delphi操作webbrowser的几个技巧

    通常需要监听 `DocumentComplete` 或 `ProgressChange` 事件,并检查所有iframe的状态,确保整个页面及所有子框架都已完成加载。 通过掌握以上技巧,Delphi开发者能够在WebBrowser组件的使用上更加得心应手,实现...

    layer弹出层父子页面事件相互调用方法

    在子页面的按钮被点击时,子页面通过parent对象向父页面传递了数据,并调用了父页面的方法,完成了跨页面的数据交互和方法调用。 知识点五:安全性考虑 在进行父子页面事件相互调用的过程中,安全性的考量是不容...

    jquery-colorbox jquery-colorbox

    五、事件监听 Colorbox提供了一系列事件,如`onOpen`、`onLoad`、`onClosed`等,方便开发者在特定时刻执行代码。 总结,jQuery Colorbox是一个强大且灵活的弹出插件,无论是展示图片、加载Ajax内容还是嵌入视频,都...

    js视频播放器

    - 自定义控件:为了提供更好的用户体验,开发者常常会创建自定义的播放、暂停、进度条、音量控制等UI元素,并通过JavaScript绑定事件监听器来响应用户交互。 - 响应式设计:视频播放器需要适应不同设备和屏幕尺寸,...

    JavaScript实现图片懒加载(Lazyload)

    当用户滚动页面使得某张图片即将进入可视区域时,通过监听滚动事件来触发图片的加载。 在进行图片懒加载的代码实现前,我们需要了解一些基本的高度概念,比如`documentElement.scrollTop`、`offsetTop`、`...

    delphi BHO.txt

    ### 十、监控页面加载完成事件 #### 知识点描述: 可以监听 `DocumentComplete` 事件来判断页面是否完全加载完毕。 #### 实现方法: 1. **定义事件处理函数**:当 `WebBrowser1` 完全加载完毕时显示提示消息。 - ...

    轻轻松松学用JavaScript 编程

    // 添加事件监听器 element.addEventListener("click", function() { alert("元素被点击了!"); }); ``` **3.2 JavaScript文档对象模型图** JavaScript的文档对象模型(DOM)是一种标准,用于表示和控制HTML文档的...

Global site tag (gtag.js) - Google Analytics