`
yiminghe
  • 浏览: 1465624 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

页面加载判断与 load 研究

阅读更多

判断页面加载完毕进行相关操作是经常碰到的问题 ,不能仅仅满足于 window.onload 或 <body onload="">。

 

<html>
	<head>
<title>页面加载问题-onload-by yiminghe</title>
<script>
function ready() {
    alert(document.getElementById('i_test').value);
}

var addE = function() {
    if (window.addEventListener) {
        return function(el, eventName, fn, capture) {
            el.addEventListener(eventName, fn, (capture));
        };
    } else if (window.attachEvent) {
        return function(el, eventName, fn, capture) {
            el.attachEvent("on" + eventName, fn);
        };
    } else {
        return function() {
            };
    }
} ();


/*

 标准DOM2事件添加,ie,ff兼容 ,等页面image、flash、iframe等都载入完才运行   ,
 在如下的 html中 若不能上126 则 等很长时间才有弹出框呢。  
 等同于  window.onload=ready;
 */

/*
	addE(window,'load',function() {
	ready();
	});
	*/
	
/*
ff 都不行,可见 body 没有 onload 事件
ie 报错,还没有 document.body 形成

*/
/*
addE(document.body,'load',function() {
	ready();
	});
	*/


/**
	  最快的方法,我们不必等待页面image、flash、iframe等都载入完(若要获取图片属性则不要用),只要htmlDOM形成就可以了,
	  
	  而这个各个浏览器有不同实现,ff 遵循了标准,而ie则没有遵循标准
	  
	  在下面的例子中 ,即使上不了 126 ,也会很快提示页面载入完成
	**/

function DOMOk(readyOk) {

    /* for Mozilla */
    if (document.addEventListener) {
        document.addEventListener("DOMContentLoaded", readyOk, false);
    }

    /* for Internet Explorer */
    if (window.attachEvent) {
        document.write("<s" + 'cript id="ie-deferred-loader" defer="defer" src="/' + '/:"></s' + "cript>");
        var defer = document.getElementById("ie-deferred-loader");
        defer.onreadystatechange = function() {
            if (this.readyState == "complete") {
                readyOk();
            }
        };
    }
}
DOMOk(ready);
</script>
</head>
<body> 
	<!--
	
	//ie ff 兼容,非常老式,在dom2标准出现之前就有了
	onload="ready()"
	
	--> 
<input id="i_test" value="1" />
<img src='http://mimg.126.com/logo/126logo_tsp.gif' />
</body>
<script>
/*
只有 ie 可以 ,可能为了兼容标准以前的ie版本,且不能放在 head 中 ,document.body尚不存在
*/
//	document.body.onload=ready;

/*
ie,ff 都不行,可见 body 没有 onload 事件
*/
/*
addE(document.body,'load',function() {
	ready();
	});
*/
</script>
</html>

 

这个问题这么复杂,那么 javascript 库肯定会考虑 ,看看 extjs 的实现吧,Ext.onReady 就不解释了,原理和上相同。需要注意的是 defer 属性并不能通过动态添加脚本标签设置,而只能在页面初始阶段通过 document.write 设置!

 

 

这里使用了 script 的 defer 属性,但是这种方法有个问题,当页面包含iframe时,必须得等该页面的 iframe 载入完毕后才会触发 defer 的脚本执行。所以更好的方法是 doScroll hack :

 

function IEContentLoaded (w, fn) {
	var d = w.document, done = false,
	// only fire once
	init = function () {
		if (!done) {
			done = true;
			fn();
		}
	};
	// polling for no errors
	(function () {
		try {
			// throws errors until after ondocumentready
			d.documentElement.doScroll('left');
		} catch (e) {
			setTimeout(arguments.callee, 50);
			return;
		}
		// no errors, fire
		init();
	})();
	// trying to always fire before onload
	d.onreadystatechange = function() {
		if (d.readyState == 'complete') {
			d.onreadystatechange = null;
			init();
		}
	};
}
 

不过这种解法仍然有问题,当页面处于 iframe 中时,doScroll 实际上不会抛错   :

 

顶层:

 

<script>
	try{
	document.documentElement.doScroll("left");
	alert(2);
}catch(e){
	alert(3);
}
</script>
<iframe src='http://yiminghe.xx.com/t/inner.html'/>
 

iframe :

 

<script>
	alert(window.top==window);
	//alert(window.frameElement);
	document.documentElement.doScroll("left");
	alert(1);
</script>
<img src='sleep.jsp'/>
 

 

所以只能在页面在顶层时使用:

// polling for no errors

	if(window==window.top)(function () {
		try {
			// throws errors until after ondocumentready
			d.documentElement.doScroll('left');
		} catch (e) {
			setTimeout(arguments.callee, 50);
			return;
		}
		// no errors, fire
		init();
	})();
 

最不好也可以用 onreadystatechange ,其complete 仍然会比window load 快,但是依然在 img load 后出发 (dean's test )。

 

另一点是关于使用 window.top == window 还是使用 window.frameElement 来判断是否是顶层窗口,如果使用 window.frameElement 的话还得注意 try catch 否则如果iframe和主页面不同域会报错,所以一般还是用 window.top==window好一点?


update : 2010-12-26

 

还是使用 window.frameElement 好,否则 ie6 下会有问题,iframe中页面如果在设置 domain 前访问了 top ,则即使 iframe 的 domain 和 外层页面一致也无法访问 window.frameElement了 :jquery ticket 4787

 

PS:ie9 quirks 模式并不能模拟 ie6 这种bug,quirks 应该是 5.5

 

结果图:

 

 

 

 

 

 

 

 

 

  • 大小: 25.2 KB
  • 大小: 42 KB
分享到:
评论

相关推荐

    懒加载案例lazyload

    懒加载(Lazy Load)是一种优化网页性能的技术,它主要用于图片、视频或JavaScript等资源的加载。在网页初次加载时,并不立即加载所有内容,而是只加载用户可视区域内的元素,当用户滚动页面到某一位置或者触发特定...

    图片延迟加载,lazyload.js使用实例

    图片延迟加载(Lazy Load)是一种优化网页性能的技术,它通过只加载用户当前视口内的图片,而将其他未显示的图片推迟到用户滚动到相应位置时再加载,从而减少了页面初次加载的时间,提升了用户体验。在网页设计中,...

    图片延迟加载 lazyload

    图片延迟加载(Lazy Load)是一种优化网页性能的技术,主要用于处理大量图片或多媒体资源的加载。在网页设计中,当用户滚动页面时,只有进入视口的图片才会开始加载,而那些还未显示出来的图片则会暂时保持占位符...

    前端实现图片懒加载(lazyload)的两种方式

    在前端开发中,图片懒加载(Lazy Load)是一种优化网页性能的技术,它允许网页只在用户滚动到可视区域时才加载图片,而不是一次性加载所有图片。这样可以显著减少页面初始加载时间,提升用户体验,尤其在处理大量...

    lazyload 即时加载图片(鼠标滑动不同页面时,才加载相应图片)

    即时加载技术,也称为懒加载(Lazy Load),在网页设计和开发中是一种优化策略,用于提升网站性能和用户体验。在本示例中,我们关注的是使用jQuery库实现的图片懒加载,特别是在用户滚动页面时,图片才会按需加载。...

    lazyload异步加载图片

    在网页初次加载时,只加载视口内的图片,当用户滚动页面,即将进入视口的图片才会被加载。这样可以显著减少页面的初始化加载时间,提升用户体验,尤其是对于内容丰富的长页面和移动设备网络环境来说,效果尤为明显。...

    js lazyLoad 图片懒加载demo

    在网页加载时,非首屏的图片不会立即下载,而是等待用户滚动到图片所在位置时才开始加载。这种方式可以有效减少初始加载时间,特别是对于包含大量图片的页面,可以极大提升页面的加载速度。 关于"js lazyload image...

    js lazyload实现网页图片延迟加载特效

    传统的网页加载方式是当页面加载时,所有图片都会立即请求并显示。然而,如果一个页面包含大量图片,这将大大增加页面的加载时间,尤其是对于移动设备或低带宽网络环境来说。延迟加载则通过只加载视口内的图片来解决...

    页面延迟加载JS包 lazyload.js scrollloading.js

    页面延迟加载技术是一种优化网页性能的...综上所述,"lazyload.js"和"scrollloading.js"是实现页面延迟加载的重要工具,它们有助于优化网页性能,提高用户体验,同时也需要开发者根据具体项目需求进行合理配置和优化。

    jQuery图片延迟加载插件Lazy Load.zip

    jQuery图片延迟加载插件Lazy Load是一种高效的前端技术,旨在优化网页性能,特别是在包含大量图片的网页上。在当今互联网环境中,用户体验是至关重要的,而快速的页面加载速度是提升用户体验的关键因素之一。Lazy ...

    动态加载Css 浏览器判断

    在现代Web开发中,动态加载CSS(层叠样式表)是一种常见的优化策略,它能够提高网页的性能,减少页面初始化时的负担。浏览器判断则是一个关键的辅助技术,用于确保我们的代码能够在不同的浏览器环境中正常运行。这...

    jquery lazyload延时加载

    总之,jQuery LazyLoad 是一个强大且灵活的工具,它能有效地解决大量图片加载带来的性能问题,提升网页加载速度和用户体验。正确使用并结合合理的优化策略,将使你的网站在资源管理和用户交互方面达到更高的水平。

    Lazyload图片延迟加载效果

    总结起来,"Lazyload图片延迟加载效果"是一个关键的前端性能优化技术,通过JavaScript的`Intersection Observer` API或滚动事件来实现,可以有效减少页面初始化时的加载时间,提高网页的响应速度和用户满意度。...

    动态加载的图片LazyLoad

    2. **事件监听**:可能由于JQuery.LazyLoad监听滚动事件的方式与浏览器的滚动机制不完全兼容,导致图片未能在正确的时间点加载。 3. **CSS和布局问题**:页面的CSS样式或布局设置可能会影响元素的可见性判断,使得...

    LazyLoad 图片懒加载

    总的来说,“LazyLoad 图片懒加载”是一种有效的前端性能优化策略,它结合了JavaScript的动态加载能力与浏览器的滚动事件,实现了图片资源的智能管理。通过分析和理解`lazyload.js`和`lazyload.min.js`的代码,我们...

    LazyLoad 延迟加载(按需加载)

    《延迟加载(LazyLoad):优化网页性能的关键技术》 在当今互联网时代,大型网站面临着一个挑战:如何在满足用户体验的同时,尽可能减少服务器资源的消耗。延迟加载(LazyLoad),也称为按需加载,就是为解决这一...

    Lazyload图片延迟加载效果.rar

    图片延迟加载,也称为懒加载(Lazy Load),是一种优化网页性能的技术。在网页设计中,尤其是在展示大量图片的页面上,这种技术能显著提升页面加载速度,提高用户体验。懒加载的核心思想是仅加载用户当前视口内的...

    延迟加载js代码下载(包括页面延迟加载以及图片延迟加载)

    综上所述,延迟加载是提升网页性能的有效手段,通过JavaScript和jQuery,我们可以轻松地实现页面和图片的延迟加载,从而提高用户访问体验。提供的压缩包文件JqueryLazyLoad.rar和LazyLoad.rar可能包含了实现这些功能...

    懒加载,滚动窗口加载,延迟加载js,jquery脚本demo

    懒加载是一种优化网页性能的技术,它允许网页在用户滚动到相关内容时才进行加载,而不是一次性加载所有内容。...通过研究和实践这个demo,开发者可以更好地理解如何在自己的项目中应用懒加载,提升网页的用户体验。

Global site tag (gtag.js) - Google Analytics