js-window.onload只能调用一次的问题!

本文介绍了一个实用的方法_addLoadEvent,用于解决网页加载时多次触发onload事件的问题。该方法能够确保即使多次调用,也能按顺序正确执行所有绑定的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详细:http://www.softwhy.com/forum.php?mod=viewthread&tid=6191
_addLoadEvent这个方法就是判断是否多次调用了onload,如果多次调用,就把多个调用的方法再Window.onload里面依次执行

function _addLoadEvent(func)
{
    var oldonload=window.onload;
    if(typeof window.onload != 'function')
    {
        window.onload=func;
    }
    else
    {
        window.onload=function()
        {
            oldonload();
            func();
        }
    }
}
_addLoadEvent(spring_x);

_addLoadEvent(spring_m);

_addLoadEvent(spring_h);

function spring_x(){
    document.write('x');
}

function spring_m(){
    document.write('m');
}

function spring_h(){
    document.write('h');
}

其实很简单的,_addLoadEvent(func),传一个函数进去,然后判断window.onload有没“绑定”一个函数(就是typeof(window.onload) != ‘function’),如果不是,就直接执行传进来的func函数。如果已经“绑定”了,那么将老的函数跟新的函数全部定义到window.onload的内部,一次执行。即:window.onload = function(){ oldonload(); func();}

### 解析 `window.onload` 首次加载触发的原因 当讨论 `window.onload` 是否会在首次加载页面时触发,实际上按照标准行为,`window.onload` 应该在页面资源完全加载完毕触发一次。然而,在某些特定场景下,比如通过浏览器缓存快速访问或是单页应用(SPA)环境中,可能会遇到预期之外的行为。 对于 SPA 如 Vue.js 构建的应用而言,由于其动态更新部分视图而无需重新加载整个 HTML 文档的特点,可能导致 `onload()` 在初次渲染前过早调用[^3]。这使得一些初始化逻辑未能按计划执行。 另外需要注意的是不同浏览器处理页面导航的方式存在差异,特别是涉及前进、后退以及刷新操作时,可能影响到诸如 `onload` 这样的事件监听器能否正常工作[^4]。 ### 提供解决方案 为了确保无论何时何地都能可靠捕获页面真正意义上的“首次加载”,建议采用如下策略: #### 使用 `pageshow` 代替 `onload` 考虑到 `onpageshow` 事件不仅适用于初始加载还会响应历史记录变化带来的页面显示情况,因此更适合用来替代传统的 `onload` 来实现更广泛的覆盖范围[^1]。 ```javascript window.addEventListener('pageshow', function(event) { // 判断是否为第一次加载而非从缓存恢复 if (!event.persisted || !sessionStorage.getItem('hasLoaded')) { sessionStorage.setItem('hasLoaded', 'true'); // 执行仅需运行一次的任务 console.log("This is the first time loading."); } }); ``` 此方法利用了 `Event.persisted` 属性来区分真正的首屏呈现还是因缓存机制引起的重现,并借助 `sessionStorage` 记录状态防止重复动作。 #### 结合 `performance.navigation.type` 检测加载模式 另一种方式则是基于现代浏览器提供的性能 API 中关于当前页面是如何被访问的信息来进行判断并采取相应措施[^2]。 ```javascript if (typeof window.performance !== "undefined") { switch(performance.navigation.type){ case performance.navigation.TYPE_NAVIGATE: console.log("Normal page load"); break; case performance.navigation.TYPE_RELOAD: console.log("Page reload detected"); break; default: console.log("Other types of navigation occurred"); } } ``` 这种方法能够帮助识别不同的浏览行为类别,从而允许开发者针对每种情形定制化处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值