我有一个包含动态生成的文本框的表单,每个文本框都有一个OnTextChanged事件的回发触发器(自动回发)。文本框全部放置在更新面板中,以便在用户输入文本框中的值后,页面的不同部分以异步方式更新。
当您在其中一个文本框中输入值时,然后单击其中一个文本框(以输入另一个值),OnTextChanged事件后新文本框焦点将丢失。为了解决这个问题,我将新的文本框ID设置为客户端会话变量,以便在完成OnTextChanged事件时(在服务器端),我可以读取客户端会话变量并设置相应的文本框焦点。
我遇到的问题是,当我尝试通过jQuery设置新文本框的焦点时,页面将几乎随机发出一个完整的回发(屏幕闪烁)(每2或3个文本框条目)。如果我只注释掉设置焦点的代码行,则页面不会执行完整的回发。最糟糕的是,如果我在jQuery焦点事件之前在浏览器中设置了一个断点,它仍然会在断点被击中之前进行整页回发,它只会在完全回发之后到达那里。这怎么会发生?
编辑:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:ListView runat="server">
<LayoutTemplate>
<asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
</LayoutTemplate>
<ItemTemplate>
<asp:TextBox runat="server" ID="tbMonth" CssClass="LHSTextBox" onkeypress="return isNumberKey(event)" OnTextChanged="SubCat_OnTextChanged" AutoPostBack="True"</asp:TextBox>
</ItemTemplate>
</asp:ListView>
</ContentTemplate>
</asp:UpdatePanel>
获取新选择的文本框ID的JavaScript:
$(".LHSTextBox").focusin(function () {
sessionStorage.setItem('newFocus', this.id);
});
C#OnTextChanged函数:
protected void SubCat_OnTextChanged(object sender, EventArgs e)
{
//do stuff
ScriptManager.RegisterStartupScript(Page, typeof(Page), "setFocusOnIdKey", "setFocusOnId()", true);
}
我在OnTextChanged服务器端函数之后调用的JavaScript函数:
function setFocusOnId() {
var newFocus = sessionStorage.getItem('newFocus');
if (newFocus !== null) {
$('#' + newFocus).focus();
//if I comment out this line, the page doesn't do a full postback, but if I leave it in, it will, even before this is hit
}
return false;
}