我有一个如下设置的复选框:
<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="showLoadingScreen(this.checked);" AutoPostBack="true" Text="Check me for more data!" />
showLoadingScreen函数如下:
function showLoadingScreen(isChecked) {
if (isChecked)
{
document.getElementById('form1').style.display='none';
document.getElementById('img_loading').style.display='block';
}
else { return false; }
}
我已经添加了else子句,希望我只能在复选框被选中后回复,但它会在任何一种情况下都回发。
我在页面上有一个网格(在form1内),在页面加载时有一组数据加载到它,但为了添加一些额外的数据,我添加了这个复选框(它运行时间更长)进程,所以我只想按需加载,而不是预先加载。当它被检查时,我想显示加载gif,回发,抓取数据,然后返回。如果取消选中该框,我不想做任何事情,因为在页面上留下足够多的数据是完全正常的(也就是说,预先显示的数据是选中复选框时显示的数据的子集)。
是否有任何方法可以使复选框自动回复,但未取消选中?
编辑:使用Dark Falcon的建议,我已将复选框修改为:
<asp:CheckBox ID="myCheckbox" runat="Server" OnClick="return showLoadingScreen(this.checked);" AutoPostBack="true" Text="Include HQ Values" />
和javascript:
function showLoadingScreen(checked) {
alert(checked);
if (checked)
{
document.getElementById('form1').style.display='none';
document.getElementById('img_loading').style.display='block';
document.form1.submit(); //my own addition, to get it to post back
}
else { return false; }
}
现在,它会在已检查时回复,但该框无法再取消选中。正如您所看到的,我添加了一个警报来显示传入的值。当您取消选中该框时,它会传递正确的值(false),但之后会以某种方式再次检查。
这不是一个大问题,因为没有理由不取消选中该框(因为正如我之前所说,检查时数据集是未经检查的数据集的超集),但我仍然想知道它为什么这样做那。有什么想法吗?
答案 0 :(得分:5)
在这种情况下,请勿设置AutoPostBack。 "AutoPostBack"
表示在此控件的值发生更改时回发到服务器... NOT 您想要的内容。
相反,使用GetPostBackEventReference(myCheckbox,"")
获取相应的回发脚本,如果选中此复选框,则从showLoadingScreen
方法调用此脚本。
答案 1 :(得分:0)
对于你的onclick处理程序,你需要这样做:
return showLoadingScreen(this.checked);
答案 2 :(得分:0)
尽量避免使用_doPostback,因为它是一个hack,您必须知道哪些控件ID正在回发,以及Microsoft ASP.NET中该Javascript函数的其他参数。要了解幕后发生的事情,你必须知道为什么会有回发以及如何防止回发发生。
以下是设置自动回发时ASP.NET复选框(ASP:Checkbox)发生的情况:
<ASP:Checkbox runat="server" id="chkCheckbox" AutoPostback="true" onclick="return isDoPostback(this.checked);" ClientIdMode="static" ... />
生成的HTML代码是:
<input type="checkbox" ... id="..." onclick="return isDoPostback(this.checked);_doPostback(...);" .../>
自定义onclick事件将附加到复选框的onclick事件的开头。无论你做什么,都会执行前置函数调用。最糟糕的是,如果你有一个返回值,_doPostback永远不会被执行。
这是你真正想做的事情(我在这里使用jQuery和原生Javascript的混合):
var checkbox = $("#chkCheckbox");
...
checkbox .on("change", function(e)
{ if(this.checked)
{
var isConfirmedToContinue = confirm("Continue with Postback?");
if(!isConfirmedToContinue)
{ this.checked = false; //Uncheck the checkbox since the user canceled out
var onClickDelegate = this.onclick;
if(onClickDelegate)
{ var me = this;
this.removeEventListener("click", onClickDelegate); //Remove the onclick event so that auto-postback no longer happens
setTimeout(function()
{ //Add back the onclick delegate after 250ms
me.addEventListener("click", onClickDelegate);
}, 250);
this.onclick = null; //Remove the current onclick event by nulling it out
}
}
}
});
答案 3 :(得分:-1)
尝试使用JS例程检查是否已选中,如果设置为true,请尝试执行以下操作:
_doPostBack(checkElementReference.name,“”);
_doPostBack负责为服务器执行通常不回发的控件的帖子。您必须传递元素的名称,该名称在服务器上恰好是服务器端复选框控件的UniqueID属性。