通常来说,window.onload就够用了,如果想加载多个事件,我们可以采取以下方式:
window.onload = function(){
}
但是如果我们需要页面完全呈现前做一些东西呢,如通过脚本加载其他js文件,或在IE6实现fixed……这些东西就要用到domReady 了,domReady好像是jQuery的叫做,一个加载函数。在W3C的草稿中,它其中是一种事件,名为 DOMContentLoaded。DOMContentLoaded事件比onload事件快许多,它是在DOM树建成之时就触发,而onload必须 要等待页面所有元素的资源都下载完毕时才触发。在标准游览器中调用这个事件很简单的:
document.addEventListener('DOMContentLoaded', function(){ |
IE虽然有这么多私有事件,但却没有一个与它相同的,最接近的是readystatechange,加上其他乱七八糟的东西,我们还是能够模拟DOMContentLoaded的。
有时我们加载事件时,可能不是单是通过一个函数就加载完的。比如我要用window.onload加载一段代码,但我还通过JS文件加载一个开源插 件,那个插件当它要处理DOM,还是需要等到DOM树完成之时,因此它可能也要搞一个window.onload块。这时页面拥有两个 window.onload代码块,很显然,第二个会覆盖掉第一个。这时,我们就要用到loadEvent这样的多重加载函数了。
var loadEvent = function(fn) { |
var oldonload = window.onload; |
if (typeof window.onload != 'function') { |
window.onload = function() { |
//*******************用法******************* |
在标准游览器中,因为有addEventListener,很轻松就实现DOMContentLoaded的多重加载,那IE怎么办?唯一的办法 是,无论是addEventListener还是attachEvent都执行,把多个要加载的代码整合到一块,一次性执行。因此,我们需要一个数组。
window.DOMLoadEvents = []; |
var addDOMLoadEvent = function(handler) { |
window.DOMLoadEvents[window.DOMLoadEvents.length]=handler |
addDOMLoadEvent(handler); |
addDOMLoadEvent(handler); |
addDOMLoadEvent(handler); |
那么怎样执行它们,上面仅仅是添加事件,我们需要另一个函数,专门用来执行它的。
var fireContentLoadedEvent = function() { |
if (arguments.callee.loaded) return; |
arguments.callee.loaded = true; |
var handlers = window.DOMLoadEvents,length = handlers.length; |
for (var i=0; i<length; i++) { |
func();//执行要在domReady运行的代码 |
那么我们要在什么时候执行上面的函数呢?我们仅讨论IE的情况。在IE中,任何DOM元素都有一个doScroll 方法,无论它们是否支持滚动条。为了判断DOM树是否建成,我们只看看documentElement是否完整就是,因为,它作为最外层的元素,作为 DOM树的根部而存在,如果documentElement完整的话,就可以调用doScroll方法了。当页面一加载JS时,我们就执行此方法,当然要 如果documentElement还不完整就会报错,我们在catch块中重新调用它,一直到成功执行,成功执行时就可以调用 fireContentLoadedEvent 方法了。
| 参数 |
描述 |
| scrollbarDown |
Default. Down scroll arrow is at the specified location |
| scrollbarHThumb |
Horizontal scroll thumb or box is at the specified location |
| scrollbarLeft |
Left scroll arrow is at the specified location |
| scrollbarPageDown |
Page-down scroll bar shaft is at the specified location |
| scrollbarPageLeft |
Page-left scroll bar shaft is at the specified location |
| scrollbarPageRight |
Page-right scroll bar shaft is at the specified location |
| scrollbarPageUp |
Page-up scroll bar shaft is at the specified location |
| scrollbarRight |
Right scroll arrow is at the specified location |
| scrollbarUp |
Up scroll arrow is at the specified location |
| scrollbarVThumb |
Vertical scroll thumb or box is at the specified location |
| down |
Composite reference to scrollbarDown |
| left |
Composite reference to scrollbarLeft |
| pageDown |
Composite reference to scrollbarPageDown. |
| pageLeft |
Composite reference to scrollbarPageLeft. |
| pageRight |
Composite reference to scrollbarPageRight. |
| pageUp |
Composite reference to scrollbarPageUp. |
| right |
Composite reference to scrollbarRight. |
| up |
Composite reference to scrollbarUp. |
var pollDoScroll = function() { |
document.documentElement.doScroll('left'); |
setTimeout(arguments.callee, 10); |
fireContentLoadedEvent(); |
我们要页面加载JS立即执行此函数,是直接pollDoScroll()吗?!不要忘记,它只是应用于IE中,我们还要判定一下浏览器。如果支持 addEventListener,也肯定支持DOMContentLoaded了(不考虑旧版本),否则就运行pollDoScroll函数。
if (document.addEventListener) { |
document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); |
完整的代码如下:
window.DOMLoadEvents = []; |
var addDOMLoadEvent = function(handler) { |
window.DOMLoadEvents[window.DOMLoadEvents.length]=handler |
var fireContentLoadedEvent = function() { |
if (arguments.callee.loaded) return; |
arguments.callee.loaded = true; |
var handlers = window.DOMLoadEvents,length = handlers.length; |
for (var i=0; i<length; i++) { |
func();//执行要在domReady运行的代码 |
var pollDoScroll = function() { |
document.documentElement.doScroll('left'); |
setTimeout(arguments.callee, 10); |
fireContentLoadedEvent(); |
if (document.addEventListener) { |
document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); |
}
- 前端开发,页面加载速度性能优化,如何提高web页面加载速度
一个网页访问速度的快慢, 不仅看它服务器的配置,这里除去你空间主机配置很烂的情况以外,我们从网站开发方面来探讨,前端技术需要从哪些方面提高访问的速度,需要用到哪些技术手段. 文件的加载 图标的加载: ...
- Javascript中页面加载完成后优先执行顺序
Javascript中页面加载完成后优先执行顺序 document优先于windowwindow优先于element //document加载完成执行方法体 document.addEventList ...
- webdriver定位页面元素时使用set_page_load_time()和JavaScript停止页面加载
webdriver定位页面元素时使用set_page_load_time()和JavaScript停止页面加载 原文:https://my.oschina.net/u/2344787/blog/400 ...
- 一步一步实现listview加载的性能优化
listview加载的核心是其adapter,本文针对listview加载的性能优化就是对adpter的优化,总共分四个层次: 0.最原始的加载 1.利用convertView 2.利用ViewHol ...
- Javascript在页面加载时的执行顺序【转】
一.在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对<script>和</script>之间 由<script />标记的src属 ...
- javascript 实现页面加载完再显示页面
document.onreadystatechange = function () { if (document.readyState == "complete") { docum ...
- JavaScript Html页面加载完成
//一.Html页面加载完成的JS写法 //1. $(function () { alert("窗体Html页面加载完成方法一"); }); //2. $(document ...
- JavaScript Html页面加载完成三种写法
//一.Html页面加载完成的JS写法 //1. $(function () { alert("窗体Html页面加载完成方法一"); }); //2. $(document ...
- javascript 实现页面加载完的操作
document.onreadystatechange = function () { if (document.readyState == "complete") {//页面加载 ...
随机推荐
- 使用virsh命令创建KVM虚拟机快照
查看虚拟机所在主机和虚拟机名称:[root@node-1 ~]# nova show a88dcf5d-c8b2-46a5-af27-a176d8235c9d|grep hyper| OS-EXT-S ...
- docker k8s 1.3.8 + flannel
docker k8s + flannel kubernetes 是谷歌开源的 docker 集群管理解决方案. 项目地址: http://kubernetes.io/ 测试环境: node-1: 10 ...
- wex5 实战 微信6位数字密码输入设计
微信支付使用是6位数字输入,用wex5能不能制作这种效果呢? 答案是肯定的. 根据网上提供的数字插件,研究源码后,与wex5进行整后修改,便于利用wex5框架优势. 一 效果演示: 弹出密码框 输入 ...
- dedecms mysql连接错误:#1040 - Too many connections
mysql能登进去一下,点任何链接又跳出来,然后就登不上了 解决办法:检查mysql所在盘是否还有空间
- Total Highway Distance
Total Highway Distance 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Little Hi and Little Ho are playing a ...
- Milk Pails
Milk Pails 题目描述 Farmer John has received an order for exactly M units of milk (1≤M≤200) that he need ...
- avi格式详细介绍
百度:http://wenku.baidu.com/link?url=KB7qKc6UG4aeU-i9FtXeV8Uou4JHPceiyz3HNbzCrQw4phY-qRlcp3tTSwYPeIgdx ...
- The Willpower Instinct
https://book.douban.com/subject/7043452/ 1.冥想2.健康饮食(低GI.素食为主,未加工食物为主).低GI食物使血糖稳定(蛋白.麦片.粗纤谷类.豆类.水果蔬菜) ...
- FastCgi与Cgi
转载请注明出处:http://www.cnblogs.com/stonehat/p/6286966.html 他们之间的不同在于 FastCgi的进程是常驻的,监听一个socket, 无线循 ...
- 关于Discuz与jQuery冲突问题的亲测解决方法
最近的一个项目整合dede和discuz程序,客户要求风格统一,所以有很多样式及特效都是要公用的.其中jQuery库定义的函数$()正好与discuz的comme.js中函数一样,这样就冲突了,导致d ...