Timer reset on page back/page forward

G

Guest

I have spent way too much time trying to solve the following problem:

I have a datalist with a timer in the footer template. It works wonderfully
except when the user pages back, then forward, and the counter is reset. I
saw in one of Kevin Spencer's comments not to put the timer in javascript on
the load function, but I have to get the script to run before the page is
rendered, otherwise my timer is not displayed. I have a flag "Hidden Test
Staus" that I try to set at first in page_load, and then reset in the
javascript.

I am getting desperate to understand what to do.

This is my code:

In the code behind:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
SqlConnection1.Open()
If IsPostBack = False Then
SetUpQuestions()
RegisterHiddenField("HiddenTestStatus", "Y")
End If

Dim HddenFld As String = Request.Form("HiddenField")
If HddenFld = "1" Then
Me.SaveEmpResponses()
Me.CalculateScore()
Me.DeleteEmployeeResponses()
Response.Redirect("frmSurveyInstruction.aspx", False)
End If
End Sub


Private Sub Page_PreRender(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.PreRender
If IsPostBack = False Then
Dim strScript As String
strScript = "<script language=""javascript"">"
strScript = strScript + "var textBeforeCountdown=""You have "";"
strScript = strScript + "var textAfterCountdown="" to complete this test
...."";"
strScript = strScript + "if (document.Form1.HiddenTestStatus.value=""Y"")
var seconds = 600;"
strScript = strScript + "else var seconds =
document.Form1.HiddenFieldTime.value;"
strScript = strScript + "document.Form1.HiddenTestStatus.value=""N"";"
strScript = strScript + "var secondsAfterAlert = 2;"
strScript = strScript + "var timer;"
strScript = strScript + "function countDown() {"
strScript = strScript + "if (seconds>=60){ "
strScript = strScript + "minutes=""""+seconds/60;"
strScript = strScript + "minutes=minutes.substring(0,1);"
strScript = strScript + "if (minutes!=""1"") mPlural=""s"";"
strScript = strScript + "else mPlural="""";"
strScript = strScript + "minutes2=minutes+"" minute""+mPlural+"" and ""; "
strScript = strScript + "seconds2=seconds-minutes*60;"
strScript = strScript + "if (seconds2!=1) seconds2=seconds2+"" seconds"";"
strScript = strScript + "else seconds2=seconds2+"" second""; "
strScript = strScript +
"timerSpan.innerHTML=textBeforeCountdown+minutes2+seconds2+textAfterCountdown; "
strScript = strScript + "}"
strScript = strScript + "else{"
strScript = strScript + "if (seconds!=1) seconds2=seconds+"" seconds""; "
strScript = strScript + "else seconds2=seconds+"" second""; "
strScript = strScript +
"timerSpan.innerHTML=textBeforeCountdown+seconds2+textAfterCountdown; "
strScript = strScript + "}"
strScript = strScript + "if(seconds ==0) {"
strScript = strScript + "stopTimer();"
strScript = strScript + "}"
strScript = strScript + "seconds--;"
strScript = strScript + "document.Form1.HiddenFieldTime.value = seconds;"
strScript = strScript + "if(seconds >=0)
timer=window.setTimeout(""countDown()"",1000);"
strScript = strScript + "}"
strScript = strScript + "function stopTimer() {"
strScript = strScript + "clearTimeout(timer); "
strScript = strScript + "document.Form1.HiddenField.value = ""1"";"
strScript = strScript + "alert(""Your time is up. Please click 'OK' to
continue to the next assessment""); "
strScript = strScript + "timerSpan.innerHTML=""You have completed your
time!!!"";"
strScript = strScript + "document.Form1.submit()"
strScript = strScript + "}"
strScript = strScript + "countDown()"
strScript = strScript + "</script>"
RegisterStartupScript("BeginTest", strScript)
End If
End Sub


In the html:

<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:datalist id="dlQuestions" style="Z-INDEX: 101; LEFT: 32px;
POSITION: absolute; TOP: 32px"
runat="server" BorderWidth="1px" GridLines="Both" CellPadding="4"
BackColor="White" BorderStyle="None"
BorderColor="#CC9966" DataKeyField="QuestNum" DataMember="Questions"
Height="328px" Width="950px"
OnItemDataBound="dlQuestions_ItemDataBound">
<SelectedItemStyle Font-Bold="True" ForeColor="#663399"
BackColor="#FFCC66"></SelectedItemStyle>
<HeaderTemplate>
<asp:Label id="Label1" runat="server" Height="42px" Font-Bold="True"
Font-Size="Medium">SHIPLEY INSTITUTE OF LIVING SCALE</asp:Label>
</HeaderTemplate>
<FooterStyle ForeColor="#330099" BackColor="#FFFFCC"></FooterStyle>
<FooterTemplate>
<asp:Button id="btnFinish" onclick="btnFinish_Click" runat="server"
Text="Finish"></asp:Button>
<span id="timerSpan"></span>
</FooterTemplate>
<ItemStyle ForeColor="#330099" BackColor="White"></ItemStyle>
<ItemTemplate>
<P>
<table border="0" cellspacing="10" cellpadding="5" bordercolor="black">
<tr>
<td width='750'>
<asp:Label id=lblQuestNum runat="server" Height="30px"
Width="100px" Font-Bold="False" Text='<%# "(" &
DataBinder.Eval(Container.DataItem,"QuestNum") & " of 40) " %>'
Font-Size="XX-Small">
</asp:Label>
<asp:Label id=lblQuestDescr runat="server" Height="30px"
Width="120px" Font-Bold="True" Text='<%#
DataBinder.Eval(Container.DataItem,"QuestDescr") %>' Font-Size="XX-Small">
</asp:Label>
<asp:RadioButtonList id="Rbl" runat="server" Width="500px"
Height="30px" Font-Size="XX-Small" DataTextField="ResponseDescr"
DataValueField="ResponseNum" RepeatLayout="Flow"
RepeatDirection="Horizontal"></asp:RadioButtonList>
</td>
</tr>
</table>
</P>
</ItemTemplate>
<HeaderStyle Font-Bold="True" ForeColor="#FFFFCC"
BackColor="#990000"></HeaderStyle>
</asp:datalist>
<asp:label id="lblErrorMessage" style="Z-INDEX: 102; LEFT: 200px;
POSITION: absolute; TOP: 8px"
runat="server" ForeColor="Red" Font-Bold="True"></asp:label>
<input id="HiddenField" type="hidden" name="HiddenField" runat="server">
<input id="HiddenFieldTime" type="hidden" name="HiddenFieldTime"
runat="server">
</form>
 
K

Kevin Spencer

Your question is confusing to read (to me), and I didn't follow it well, but
I can tell you why the JavaScript timer isn't working. You're using the
JavaScript setTimeout function to call your countDown function. The
setTimeout function only executes one time. You need to use the JavaScript
setInterval function if you want to continually call the countDown function.

--
HTH,

Kevin Spencer
Microsoft MVP
..Net Developer
Who is Mighty Abbott?
A twin turret scalawag.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top