加载页面或返回到页面时不触发 onload 事件处理程序

本文详细介绍了在框架集环境中遇到的顶级框架加载事件处理程序未触发的问题,并提供了解决方案,通过添加onunload事件处理程序来解决此问题。通过两个示例代码演示了如何实现这一解决方案。

症状

当您跟踪链接在框架集中顶框架, 然后返回到启动位置, 页 onload 事件处理程序, 目标不触发。


解决方案

要解决此问题, 添加 onunload 事件处理程序。以便它将激发 (但不知道如何完成此操作) 这开启 onload 事件处理程序。


状态

Microsoft 已确认这是列出了本文 " 适用于 " 一节中 Microsoft 产品中存在错误。

方案1:

1.

frame.htm 和 test.htm 保存到 Web 服务器。

frame.htm

<html>
<frameset rows="*,*">
<frame src="test.htm">
</frameset>
</html>

test.htm

<HTML>
<HEAD>
<SCRIPT language='JavaScript'>
function testMessage()
{
alert("onload");
}
</SCRIPT>
</HEAD>
<BODY onload="testMessage()">
<a href="http://www.microsoft.com" target="_top">test</a><br>
</BODY>
</HTML>

2.

使用 Microsoft Internet Explorer Macintosh 查看 frame.htm。 将出现对话框框表示为框架 onload 事件处理程序已触发。

3.

单击链接以查看其他网页顶部框架中。

4.

单击 后退 按钮。 不触发 onload 事件处理程序。

5.

如果添加下列 onunload 事件处理程序, 不会发生此问题。

<BODY onload="testMessage()" onunload="">


方案2:


把OnLoad()事件修改,不用onload事件,随便用个事件名替换它,入Winload();

然后在框架代码的下方加入这个事件的调用即可;

如:

<HTML>

<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=gb2312">

<SCRIPT LANGUAGE=javascript>

<!--

//解决页面加载时无法进入onload的问题

function winOnload() {

alert(“替换Onload事件”);

}

//-->

</SCRIPT>

<TITLE>评分环境检测系统</TITLE>

</HEAD>

<BODY>

</TABLE><SCRIPT LANGUAGE="JavaScript">

<!--

//从新处理设置的路径参数

document.getElementById("ifControl").src="about:Blank";

document.getElementById("ifSave").src="about:Blank";

document.getElementById("ifInfo").src="Post.asp"

//解决页面加载时无法进入onload的问题 winOnload();

//-->

</SCRIPT>

</BODY>

</HTML>



事实证明下面这种方法有时更有有效

在钉钉小程序中,当页面被缓存后,`onLoad` 方法会再次触发,即使传入的参数发生变化。这是因为钉钉小程序页面生命周期机制中,`onLoad` 仅在页面首次加载执行一次,而页面缓存后再次进入会重新调用 `onLoad`。为了解决页面缓存后传值改变但无法触发 `onLoad` 的问题,可以采用以下方案: ### 使用 `onShow` 生命周期替代 `onLoad` 处理数据更新 钉钉小程序支持 `onShow` 生命周期函数,该函数在页面显示被调用,包括从下级页面返回。因此,可以将原本在 `onLoad` 中处理的数据更新逻辑移至 `onShow` 中执行,以确保页面显示能获取最新的传参并更新页面内容。 ```javascript Page({ data: { params: {} }, onLoad(options) { // 初始加载获取参数 this.setData({ params: options }); }, onShow() { // 页面显示重新获取参数并更新 const options = this.options || {}; // 获取当前页面参数 this.setData({ params: options }); this.handleDataUpdate(options); // 自定义数据处理函数 }, handleDataUpdate(options) { // 处理参数变化后的逻辑 console.log('当前参数:', options); } }); ``` ### 手动监听参数变化并触发更新 如果页面数据依赖于传入的参数,可以在 `onShow` 中手动判断当前参数是否发生变化,并根据变化触发相应的数据更新操作。这样即使页面被缓存,也能确保在参数变化更新页面内容。 ```javascript Page({ data: { lastParams: {}, params: {} }, onLoad(options) { this.setData({ params: options, lastParams: options }); }, onShow() { const currentParams = this.options || {}; if (JSON.stringify(currentParams) !== JSON.stringify(this.data.lastParams)) { this.setData({ params: currentParams, lastParams: currentParams }); this.handleDataUpdate(currentParams); } }, handleDataUpdate(params) { console.log('参数更新,执行数据加载:', params); } }); ``` ### 使用全局状态管理事件机制 对于需要跨页面共享响应参数变化的场景,可以使用全局状态管理(如 `globalData`)事件总线机制,在页面显示订阅相关事件并更新数据,避免依赖 `onLoad` 的调用。 ```javascript // app.js globalData = { currentPageParams: {} }; // page.js const app = getApp(); Page({ onShow() { const currentParams = this.options || {}; if (JSON.stringify(currentParams) !== JSON.stringify(app.globalData.currentPageParams)) { app.globalData.currentPageParams = currentParams; this.handleDataUpdate(currentParams); } }, handleDataUpdate(params) { console.log('全局参数更新,执行数据加载:', params); } }); ``` ### 总结 钉钉小程序页面缓存后,`onLoad` 会再次触发的问题可以通过使用 `onShow` 生命周期、手动监听参数变化、结合全局状态管理等方式解决。这些方法可以确保页面在参数变化仍能正确更新数据,提升用户体验。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值