2

使用多个不同的关键字在线搜索后,我一直无法找到解决问题的方法。

我首先寻找一种方法来弹出一条消息,要求用户在会话取消前一分钟更新他们的会话。我决定使用的解决方案是在母版页中运行一个 javascript 计时器,并在 Masterpage.Page_Load() 上调用它。这样,每当我的用户从一个页面导航到另一个页面时,他们都会重置计时器。但是,由于用户将使用的许多页面都具有更新面板并异步更新,因此可以访问我正在使用的功能,但会被跳过(根据调试器)。

我正在使用的功能是:

ScriptManager.RegisterStartupScript(main, this.GetType(), "callTimer", "callTimer();", true);

此函数在常规回发或母版页上的异步回发上运行良好(我通过在母版页的更新面板上执行回发来更新计时器),但是,在异步回发上将被跳过。

我已经尝试了一些东西,使功能 Page 或 Masterpage 中的 UpdatePanel 或子页面中的 updatepanel 的控制。我也尝试将此代码放在子页面中,但是虽然这些更改确实重置了计时器,但它会导致 javascriptcode 运行多次,并且它们会争夺显示倒计时的标签。

我在这里真的很茫然。我认为一个可能的解决方案是更改启动脚本的控件并再次终止在该代码之前运行的所有 javascript。然而,寻找以编程方式终止、取消或停止 javascript 函数的方法也不会产生有用的结果。

我可以接受的另一个解决方案是在鼠标移动时重置计时器,但由于我正在为 IE8 设计,除非窗口失焦,否则这将不起作用。

4

2 回答 2

0

在部分回发的情况下需要通过 注入脚本ScriptManager,否则不会重新执行。这是一个为您处理注入逻辑的实用程序函数(vb.net):

Public Shared Sub InjectScript(ByVal containingPage As Page, ByVal scriptKey As String, ByVal scriptText As String)
    Dim sManager = ScriptManager.GetCurrent(containingPage)

    If sManager IsNot Nothing AndAlso sManager.IsInAsyncPostBack Then
        //the page is being partially-posted back by an Ajax control (e.g. UpdatePanel)
         ScriptManager.RegisterStartupScript(containingPage, GetType(Page), scriptKey, scriptText, True)
    Else
        //standard postback
        containingPage.ClientScript.RegisterStartupScript(GetType(Page), scriptKey, scriptText, True)
    End If
End Sub
于 2012-12-14T16:45:13.193 回答
0

我找到了解决这个问题的方法:我可以通过将当前 date.time 作为数字发送到 javascript 函数来解决这个问题。从那里我将倒计时标签的值设置为 date.time。在那里,在我的计时器期间,如果我发现标签的 date.time 与函数开始的那个不匹配,它将返回并结束函数。这意味着只有函数的最新实例在任何给定时间保持运行。

于 2012-12-17T20:47:21.977 回答