浅谈使用原生JS在页面加载完成之后处理多个函数

网页中,一般使用JavaScript脚本的运行需要通过事件来触发。一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能:

<div id="link" onclick="fun()"></div>

当鼠标点击id为link的元素的时候,就触发了它的onclick事件,然后执行使用了JavaScript定义的fun函数,这样的做法肯定是不合理的,因为触发操作直接写到了HTML结构里,内容和行为没有隔离开。

此外,当事件处理与对应元素绑定在一起的时候,只有那个元素在加载完之后才能进行操作。如果说把处理的脚本放在了head区域,在元素还没有加载完成的时候,浏览器就会报错,head中的处理部分HTML元素的脚本已经被执行了。

JavaScript正确的使用方法应该是脚本与HTML元素分离、当页面加载完成的时候再去执行,本文就来讲解如何使用原生JavaScript来实现。


使用监听器让脚本与HTML元素分离

监听器实际上的功能是使行为和内容进行分离的。以前需要在HTML中加上一些事件来触发JavaScript的相关函数,而现在直接在JavaScript中对某个元素使用监听器,监听这个元素的事件,如果这个元素被触发了某些事件,在监听器中又定义了这个事件对应的处理函数,那么就会处理这个函数。

W3C的标准方法是addEventListener,被IE9,chrome,firefox,opera所支持,用法:

window.addEventListener('load','function',false)

早期IE中有attach方法效果类似(做ie兼用):

window.attachEvent('onload',function)

上面这两个监听器的作用:监听window对象,如果window对象的load(加载完成)事件被触发,那么就执行function这个函数。使用监听器的方法很简单,就是先获取页面中的某个元素,然后对这个元素使用监听器,定义监听的事件和对应的事件处理函数,例如:

document.getElementById('link').addEventListener('click',fun,false)

window.onload事件

onload事件只有在整个页面已经完全 载入的时候才会被触发,将JavaScript代码写进onload事件中,就可以保证在HTML元素被加载完成之后,浏览器才会处理我们的JavaScript代码,例如:

window.onload = function(){
  //code
}

这样,这个函数里面的code会在函数成功加载完成之后被处理。这个方法的缺陷是只能作用一个函数。页面中无法出现多个window.onload事件,如果出现了多个onload事件,那么后面的内容会覆盖掉前面的。

那么,可以在一个window.onload事件中,写上所有需要加载的函数名,然后在外面定义函数:

window.onload = function(){ 
  func1() 
  func2()
}
function func1(){}
function func2(){}

这样做虽然可以解决在网页内容加载完成之后执行响应的JavaScript代码,虽然很不方便,因为我们要把所有需要加载的函数名都写进去,修改起来就会很麻烦。


结合监听器和window.onload实现页面加载完处理多个函数

这里需要提到监视器一个优势:可以为一个元素上的同一个事件添加或者去除多个处理函数。前面说过window.onload事件加载的缺陷是只能在页面使用一次。而使用监听器的方法,就可以监听为window.onload的多个函数,例如:

function addLoadListener(fn){
  if(typeof window.addEventListener != 'undefined'){
    window.addEventListener('load',fn,false)
  }else if(typeof document.addEventListener){
    document.addEventListener('load',fn,false)
  }else if(typeof window.attachEvent != 'undefined'){
    window.attachEvent('load',fn)
  }else{
    var oldfn = window.onload
    if(typeof window.onload != 'function'){
      window.onload = fn
    }else{
      window.onload = function(){
          oldfn()
          fn()
      }
    }
  }
}

这个函数使用if语句判断了浏览器对监听器的支持情况并且分别做了处理。如果不支持监听器,那么就使用默认的window.onload方法加载。这个函数的使用方法也比较简单,把它放在JavaScript最顶部,然后在下面编写功能函数,如果需要将某个功能函数使用这个方法加载,就可以把函数名作为参数调用这个自定义的addLoadListener。代码如下:

addListener(func)
function func(){}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容