Javascript 客户端 & asp.net 事件处理程序计时问题 - 如何解决?

Javascript client & asp.net event handler timing issues - how to solve?

具有母版页和多个子页的简单网站。

在 page_load 中,母版页查找包含值的会话变量,如果存在,则使用

Page.ClientScript.RegisterStartupScript(this.GetType(), "SessionAlert", "SessionExpireAlert(" + sessionTimeout + ");", true);

这会启动超时警报,效果很好。

在一个子页面上有一个服务器端按钮,可以有效地结束页面上的用户交互并留下一条消息说明 "go and log in again if you want to do more stuff"。单击此按钮后,我想清除会话变量(简单)并结束 运行 超时警告警报脚本(不太容易)。

由于 Master "page_load" 事件在按钮处理程序之前触发,因此在页面重新加载时,它会重新启动超时脚本。当它点击按钮事件处理程序并清除会话变量时,为时已晚,因为脚本已经 运行.

我试过使用"registerclientscriptblock"注入立即javascript来调用我拥有的"clearTimeout()"客户端函数,但它似乎无法找到该函数存在于主页和错误中。

这似乎是一个经典的 "chicken and egg" 场景,我只见树木不见森林。有人能在我发疯之前给我指明正确的方向吗?

编辑以添加一些 javascript 代码:

目前 page_load 代码引用的母版页函数 "SessionExpireAlert" 包含以下内容:

                 window.updateInterval = setInterval(function () {
                     seconds--;
                     document.getElementById("idleTime").innerHTML = convertTime(seconds);
                     document.getElementById("expireTime").innerHTML = convertTime(seconds);
                 }, 1000);

RegisterStartupScript 会将脚本添加到主体的末尾,因此 DOM 在运行时已准备就绪。只要您在此之后始终使用 RegisterStartupScript,那么脚本将按照您创建它们的顺序添加和执行。

基本上,RegisterClientScriptBlock 最有可能将脚本放在 之前 添加了 RegisterStartupScript 的任何脚本。

您是否考虑过将其放入 Page_PreRender 中:

Page.ClientScript.RegisterStartupScript(this.GetType(), "SessionAlert", "SessionExpireAlert(" + sessionTimeout + ");", true);

先进行适当的检查,看看是否有必要?