首页>建站相关>事件加载函数addLoadEvent

事件加载函数addLoadEvent

动态的网页往往会使用Javascript来对页面元素进行一些操作,比如为某个按钮绑定一个点击事件,或者给某个输入框添加获得焦点后的事件。因为页面内容自上而下顺序被读取,当程序运行至某段Javascript代码时,其想要操作的Html元素可能尚在赶来的途中,代码无法准确定位到需要操作的元素,后续行为自然也难以为继了。为了确保页面上的Javascript代码能够稳定运行,我们需要确保代码运行前,Html文档已经正确被加载。window.onload就是这样一个事件,在文档加载完成后能立即触发,并且能够为该事件注册事件处理函数。我们可以把页面正确加载后需要执行的Javascript函数一股脑的塞给它,就像这样:

/*========
window.onload
========*/
window.onload=function(){
    Func1();
    Func2();
    Func3();
    .....
}

事件处理函数addLoadEvent

这样做的不便之处在于,每一个新函数被定义,都需要回滚到window.onload的位置重新添加。想象一下项目文件较大,新函数与事件处理函数相隔几条街的情况,如果不幸这个项目改动还比较频繁,那这样的来回修改也会耗费不少的时间。为了减少这样的重复操作,在《JavaScript DOM编程艺术》一书中,给出了这样一个代替方案:

/*========
事件处理函数
========*/
function addLoadEvent(func){
    var oldonload = window.onload;
    if (typeof window.onload != 'function'){
        window.onload = func;
    } else {
        window.onload = function(){
        oldonload();
        func();
        }
    }
}

上面这段函数对window.onload进行了封装,利用addLoadEvent函数,我们可以在js语句或js文件的任意位置,将新增的某个函数加入事件处理的队列,只需要将函数名称作为参数传递给addLoadEvent:

/*========
事件处理示例
========*/
function fun1(){
    console.log('hello world!');
}
addLoadEvent(fun1);

让addLoadEvent传递参数

addLoadEvent为事件处理提供了便利,但由于它只支持传入函数的名称,遇到需要传递参数的场合,就有点捉襟见肘了。为了能够让addLoadEvent支持传参,我们需要对函数进行一些改动:

/*========
含参事件处理
========*/
function addLoadEventArgs(func) {
    var args = [].slice.call(arguments,1);
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = function() {
            func.apply(this,args);
        }
    } else {
        window.onload = function() {
            oldonload();
            func.apply(this,args);
        }
    }
}

函数第二行的arguments是我们运行函数时所传入的参数,该行语句会摘除第一个参数——也就是我们所需要运行的函数名,将其后的1个或多个参数存入数组,待文档调用完毕,函数可以执行时再将此数组传递给需要运行的函数:

/*========
含参事件示例
========*/
function test1(a){
    console.log(a);
}
function test2(a,b) {
    console.log(a+b);
}
addLoadEventArgs(test1,'hello');
addLoadEventArgs(test2,3,2);

标签: javascript

移动端可扫我直达哦~

推荐阅读

javascript 2023-10-13

用jquery取代a链接的title说明文字

站点的标签页原来是类似下图左侧的,在标签后用括号的形式展示了文章数量,边栏本来就小,加了数字后感觉内容变长,也有点影响标签文字的识别,就想着改成下图右侧的形式。记录一下原来生成含数字标签的代码,方便以后修改时的查询:<?php ...

建站相关 javascript

javascript 2023-10-11

js正则表达式的匹配与替换操作

利用exec()可以提取到某一段字符串中的指定的值,比如有下面这样一行字符串:a='-aaaa-bbbb-cccc-';想要分别提取其中的连续的字符,即“aaaa”、“bbbb”、“cccc”,书写正则表达式如下,并利用exec()函...

建站相关 javascript

javascript 2023-10-09

双栏多栏主题图片的lazyload问题

想为全站添加lazyload效果,这样在图片加载成功后会得到一个渐变显示的效果,看起来酷酷的。使用jquery的lazyload老牌插件,先写的js效果,后添加的模块,左边栏的图片加载的好好的,等到右边栏输出缩略图时,就出现了问题。l...

建站相关 javascript

javascript 2023-09-27

php如何传递数据给前端的javascript

尝试写主题的时候遇到了需要利用后台的设置数据去改变前端javascript设置的需求,比如后台设置一个幻灯的轮播速度为“5000”毫秒,需要将这个数据传递给js插件“slidejs”。最初的做法是利用php直接输出一段标签,类似下面这...

建站相关 javascript

javascript 2023-05-28

利用js获取当前页面的域名与网络协议等信息

浏览器会在用户有历史搜索记录之后自动弹出一些关键词供用户选择。但弹出的窗口的位置往往距离输入框过近,弹窗样式也不是特别好看。所以准备参考360,记录用户的搜索关键词,以标签的形式放在弹出窗口中,当输入框获取到焦点时,弹出自定义的窗口,...

建站相关 javascript

javascript 2023-05-09

利用localStorage保存用户的浏览记录

尝试在页面上加载了一言,没事刷新页面就会看到一条新的记录。偶然刷到这样一句话:“大佬永远都觉得自己是萌新”,秉承这种态度的人,一方面可能是出自谦虚。另一方面,技术迭代日新月异,知识浩如烟海,能在某一方面保持拔尖的人,确实为数不多。说回...

建站相关 javascript

javascript 2023-04-27

利用console.time来测试一下js程序的执行效率

想测试一下自己的程序跑一圈需要多少时间,可以尝试启动一个计时器来跟踪它的占用时长。每一个计时器必须拥有唯一的名字。当以此计时器名字为参数调用 console.timeEnd() 时,浏览器将以毫秒为单位,输出对应计时器所经过的时间。启...

建站相关 javascript

javascript 2023-04-10

利用lazysizes.js实现图片懒加载

站点的专题图片稍有点大,恩,其实主要是服务器的带宽过小。导致访问的时候图片加载过慢,页眉部分会空出一块,直到加载结束。于是就想参照joe主题的样式,做一个图片懒加载的效果。joe主题使用了lazysizes实现图片的懒加载。于是查询了...

建站相关 javascript