ASP.NET 倒计时器(时、分、秒)

ASP.NET countdown timer (hours, minutes, seconds)

我必须制作一个倒数计时器,您可以在其中选择计时器倒计时的秒数、分钟数和小时数。我找到了一个视频 (https://youtu.be/zgxV7LaoGAk?t=930),其中这个人解释了一切是如何工作的,但他的计时器不包括小时数。

这是只有分钟和秒的倒数计时器的代码:

var currentMinutes = (newTime.Length > 2) ?
    int.Parse(newTime.Substring(0, newTime.Length - 2)) :
    0;

var currentSeconds = (newTime.Length > 2) ?
    int.Parse(newTime.Substring(newTime.Length - 2)) :
    int.Parse(newTime);

谁能告诉我如何编写带有秒、分钟和小时(var currentHours ?)的倒数计时器的代码?

var currentHours = ...


var currentMinutes = (newTime.Length > 2) ?
    int.Parse(newTime.Substring(0, newTime.Length - 2)) :
    0;

var currentSeconds = (newTime.Length > 2) ?
    int.Parse(newTime.Substring(newTime.Length - 2)) :
    int.Parse(newTime);

好的,那该怎么做呢?

好吧,我们可以做 100% 服务器端代码 - 如果你卡住了,那就太好了 - 不知道 JavaScript

所以,假设我们放入 3 个标签

放入 3 个文本框。

放入定时器控件。

放入 4 个按钮 -(稍后查看我们如何使用它们)。

我们有这个:

    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

    <div style="width:350px;padding:20px">

    <div style="margin:auto">

        <div style="float:left">
            <asp:Label ID="lblHours" runat="server" Text="Hours" Font-Size="Larger" ClientIDMode="Static"></asp:Label>
            <br />
            <asp:TextBox ID="txtHours" runat="server" Text="0" ClientIDMode="Static" CssClass="tbox"></asp:TextBox>
        </div>

        <div style="float:left;margin-left:20px">
            <asp:Label ID="lblMin" runat="server" Text="Minutes" Font-Size="Larger"></asp:Label>
            <br />
            <asp:TextBox ID="txtMin" runat="server" Text="0" CssClass="tbox" ClientIDMode="Static"></asp:TextBox>
        </div>

        <div style="float:left;margin-left:15px">
            <asp:Label ID="lblsec" runat="server" Text="Seconds" Font-Size="Larger"></asp:Label>
            <br />
            <asp:TextBox ID="txtSec" runat="server" BorderStyle="Solid" Text="5" CssClass="tbox" ClientIDMode="Static" ></asp:TextBox>
        </div>

        <div style="clear:both;height:15px"></div>

        <div style="margin:auto">
            <asp:Button ID="cmdStart" runat="server" Text="Start" />
            <asp:Button ID="cmdStop" runat="server" Text="Stop" style="margin-left:20px" />

            <asp:Button ID="cmdStartJS" runat="server" Text="Start JS" style="margin-left:20px"
                OnClientClick="mystart();return false" />
            <asp:Button ID="cmdStopJS" runat="server" Text="Stop JS" style="margin-left:20px"
                OnClientClick="mystop();return false"/>
            <br />
            <asp:Label ID="lblDone" runat="server" Text="" ClientIDMode="Static"></asp:Label>
        </div>

    </div>
    </div>
    <asp:Timer ID="Timer1" runat="server"></asp:Timer>

我们的代码将如下所示:

Protected Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click

    ' take entered values - convert to time
    Dim MyTime As DateTime
    MyTime = TimeSerial(txtHours.Text, txtMin.Text, txtSec.Text)

    ' save time value
    ViewState("MyTime") = MyTime

    Timer1.Interval = 1000  ' upddate every one second
    Timer1.Enabled = True   ' start the timer.
    lblDone.Text = "Started"
End Sub

Protected Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    Dim myTime As DateTime = ViewState("MyTime")

    ' check if we are to stop
    If myTime <= TimeSerial(0, 0, 0) Then
        Timer1.Enabled = False      ' turn off timer
        ' do whatever for end of timer
        lblDone.Text = "Done!"
        Exit Sub
    End If

    Dim OneSecond As TimeSpan = TimeSpan.FromSeconds(1)

    myTime = myTime - OneSecond
    ' update text boxes
    txtHours.Text = myTime.Hour
    txtMin.Text = myTime.Minute
    txtSec.Text = myTime.Second

    ViewState("MyTime") = myTime

End Sub

Protected Sub cmdStop_Click(sender As Object, e As EventArgs) Handles cmdStop.Click
    Timer1.Enabled = False
End Sub

输出:

所以上面说的桌面方法非常相似。 (就像在桌面上一样,我们甚至加入了那个计时器控件)。

缺点当然是这意味着每 1 秒 post-back。

但是,我们可以用一个更新面板包围上面的标记 - 它看起来会非常光滑。

第二种方式:

100% 客户端代码。

因此,在上面的页面中,让我们为“js 按钮”编写 JavaScript 代码

我们有这个(我确实假设这个页面使用了 jQuery - 但现在已经很假设了)。

<script>

    MyTime = new Date(0,0,0,0,0,0)
    TimeZero = new Date(0,0,0,0,0,0)
    MyTimer = 0

    tH = $("#txtHours")
    tM = $("#txtMin")
    tS = $("#txtSec")

    function mystart() {

        MyTime.setHours(tH.val())
        MyTime.setMinutes(tM.val())
        MyTime.setSeconds(tS.val())

        if (MyTime > TimeZero) {
            MyTimer = setInterval(mytic,1000)
            $("#lblDone").text("Start")
        }
    }

    function mytic() {

        MyTime.setSeconds(MyTime.getSeconds() - 1)

        tH.val(MyTime.getHours())
        tM.val(MyTime.getMinutes())
        tS.val(MyTime.getSeconds())

        if (MyTime <= TimeZero) {
            clearInterval(MyTimer)
            $("#lblDone").text("Done !!!")
        }
    }

    function mystop() {
            clearInterval(MyTimer)
    }
</script>

因此 JavaScript 或服务器端代码做的事情几乎相同。

您注意到的主要区别是客户端代码? 它永远不会到达服务器端,因此看起来更流畅。