5

我在假设页面上有 5 个复选框,如果选中其中任何一个,我想执行回发。但是,我想稍微延迟回发,以便如果用户选中一个框,它会等待一秒钟左右,以确保用户在往返服务器之前不想检查更多框。因此,如果您快速连续检查所有五个,则可以在发送回发之前检查所有五个。

有没有人这样做,看到这样做,知道如何做到,或者有充分的理由不这样做?

4

4 回答 4

7

您没有说您使用的是 jQuery,但为了讨论和清楚起见,我假设它是可用的。类似的东西应该适合你:

var timeout = null;

// Set up code to respond to when the checkbox is checked/unchecked
$('input[type="checkbox"]').change(function() {
    // If this is the second check box in a row, clear previous timeout
    if (timeout != null) 
        clearTimeout(timeout);

    // Set a timeout that will fire in 5 seconds 
    timeout = setTimeout(function() {
          // Post back the form
        __doPostBack();
    }, 5000);
});
于 2012-04-13T22:49:32.723 回答
7

为什么不AutoPostBack="false"打开复选框并通过按钮触发回发?这样,用户就有机会检查他们想要的一切,并在他们想要的时候提交结果。


由于您对回发的 1 个按钮的评论对用户来说是违反直觉的,为什么不将每个复选框包装在 UpdatePanel 中?它可能需要更多的标记,但它会完全按照您的意愿行事,而无需执行“延迟回发”方案。

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox1" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox2" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox3" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel4" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox4" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>

<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Conditional">
    <asp:CheckBox ID="CheckBox5" runat="server" AutoPostBack="true" />
</asp:UpdatePanel>
于 2012-04-14T01:45:16.843 回答
2

有没有人这样做,看到这样做,知道如何做到,或者有充分的理由不这样做?

我反对任何重新加载或修改页面结构的延迟操作。原因如下:

原因 #1
人们使用各种输入法以截然不同的速度点击。

原因 #2
行为应该是一致的,不受只有你知道的隐藏规则的约束。有时用户受过大量训练并且可以利用优化,但大多数时候他们不是。

原因 #3
结构更改(尤其是异步执行的更改)可能会撤消后续操作。

例子:

  • 用户选中一个框。
  • 页面在短暂延迟后异步回发。
  • 用户取消选中同一个框。
  • 异步回发完成,重新选中该框。

这是任何异步回发的设计考虑因素,但延迟使其更不直观。

替代方案
如果操作要求在回发发生时执行整个生命周期,那么我会主张立即执行回发。

如果该操作不需要执行页面的整个生命周期,我建议使用某种 AJAX 调用在后台执行逻辑,并完全消除回发。然后,您可以使用结果值来更新浏览器(如有必要)。

于 2012-04-23T04:48:51.557 回答
0

我也遇到过一次这个问题。我设法使用存储在隐藏字段中的标志使其工作。考虑一下:

<%-- SomePage.aspx --%>
<asp:HiddenField ID="checkboxClicked" runat="server" Value="false" />

<asp:CheckBox ID="checkBox1" runat="server" Text="Check 1" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox2" runat="server" Text="Check 2" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox3" runat="server" Text="Check 3" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox4" runat="server" Text="Check 4" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />
<asp:CheckBox ID="checkBox5" runat="server" Text="Check 5" AutoPostBack="true" OnClientClick="return onCheckboxClick();" OnClick="OnCheckBoxClick" />

<%
    protected void OnCheckBoxClick(object sender, EventArgs args)
    {
        // Your code here...

        checkboxClicked.Value = "false";
    }
%>

<script type="text/javascript">

    function onCheckboxClick() {
        var canPostBack = true;

        if ($('#checkboxClicked').val() === 'true') {
            canPostBack = false;
        }
        else {
            $('#checkboxClicked').val('true');
            canPostBack = true;
        }

        return canPostBack;
    }

</script>
于 2012-04-23T14:53:43.280 回答