How to maintain the focus on same control after asynchronous postback?
ajax, asp.net, c#, javascript, jquery
Solution
Here is a slightly modified version of @Darshan's script which uses jQuery. I like his solution because this 1 script will work with all UpdatePanels so you don't have to write code specifically for each and every UpdatePanel.
My modifications are:
- Uses jQuery
- Performs null checks
- Doesn't pollute global namespace
- Edit: Tabbing works as expected with TextBoxes with autopostback.
/* Retain element focus after UpdatePanel postback
***************************************************/
jQuery(function ($) {
var focusedElementId = "";
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(function (source, args) {
var fe = document.activeElement;
if (fe != null) {
focusedElementId = fe.id;
} else {
focusedElementId = "";
}
});
prm.add_endRequest(function (source, args) {
if (focusedElementId != "") {
$("#" + focusedElementId).focus();
}
});
});
Chosen.jQuery
This version will work with the Chosen jQuery plugin.
/* Retain element focus after UpdatePanel postback
***************************************************/
jQuery(function ($) {
var focusedElementSelector = "";
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_beginRequest(function (source, args) {
var fe = document.activeElement;
focusedElementSelector = "";
if (fe != null) {
if (fe.id) {
focusedElementSelector = "#" + fe.id;
} else {
// Handle Chosen Js Plugin
var $chzn = $(fe).closest('.chosen-container[id]');
if ($chzn.size() > 0) {
focusedElementSelector = '#' + $chzn.attr('id') + ' input[type=text]';
}
}
}
});
prm.add_endRequest(function (source, args) {
if (focusedElementSelector) {
$(focusedElementSelector).focus();
}
});
});
Problem
I have 3 textboxes , one is in updatepanel it will refresh for every 4 seconds. During refresh the controls which are not in update panel also loosing focus. I want to keep focus on those controls. Here is my code: ``` <asp:UpdatePanel ID="upnlChat" runat="server"> <ContentTemplate > <asp:TextBox ID="txtChatBox" ReadOnly="true" TextMode="MultiLine" CssClass="mymultitextboxclass" runat="server"></asp:TextBox> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="timerChat" /> </Triggers> </asp:UpdatePanel> <asp:Timer ID="timerChat" Interval="4000" runat="server" ontick="timerChat_Tick" ></asp:Timer> <table> <tr><td>User: </td><td colspan="2"><asp:TextBox ID="txtUser" runat="server" ></asp:TextBox><br /></td> <td> <asp:RequiredFieldValidator ID="RequiredUserName" runat="server" ErrorMessage="Username Required" ControlToValidate="txtUser" ></asp:RequiredFieldValidator> </td></tr> <tr><td>Message: </td><td><asp:TextBox ID="txtMsg" CssClass="mymsg" TextMode="MultiLine" onkeydown="if (event.keyCode == 13) { btnSend.focus(); this.form.submit(); }" runat="server"></asp:TextBox></td> <td colspan="2"><asp:Button ID="btnSend" runat="server" onclick="btnSend_Click" OnClientClick="scroll()" Text="send" /> </td></tr> </table> ``` Can anyone please help me?