我在假设页面上有 5 个复选框,如果选中其中任何一个,我想执行回发。但是,我想稍微延迟回发,以便如果用户选中一个框,它会等待一秒钟左右,以确保用户在往返服务器之前不想检查更多框。因此,如果您快速连续检查所有五个,则可以在发送回发之前检查所有五个。
有没有人这样做,看到这样做,知道如何做到,或者有充分的理由不这样做?
我在假设页面上有 5 个复选框,如果选中其中任何一个,我想执行回发。但是,我想稍微延迟回发,以便如果用户选中一个框,它会等待一秒钟左右,以确保用户在往返服务器之前不想检查更多框。因此,如果您快速连续检查所有五个,则可以在发送回发之前检查所有五个。
有没有人这样做,看到这样做,知道如何做到,或者有充分的理由不这样做?
您没有说您使用的是 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);
});
为什么不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>
有没有人这样做,看到这样做,知道如何做到,或者有充分的理由不这样做?
我反对任何重新加载或修改页面结构的延迟操作。原因如下:
原因 #1
人们使用各种输入法以截然不同的速度点击。
原因 #2
行为应该是一致的,不受只有你知道的隐藏规则的约束。有时用户受过大量训练并且可以利用优化,但大多数时候他们不是。
原因 #3
结构更改(尤其是异步执行的更改)可能会撤消后续操作。
例子:
这是任何异步回发的设计考虑因素,但延迟使其更不直观。
替代方案
如果操作要求在回发发生时执行整个生命周期,那么我会主张立即执行回发。
如果该操作不需要执行页面的整个生命周期,我建议使用某种 AJAX 调用在后台执行逻辑,并完全消除回发。然后,您可以使用结果值来更新浏览器(如有必要)。
我也遇到过一次这个问题。我设法使用存储在隐藏字段中的标志使其工作。考虑一下:
<%-- 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>