javascriptjqueryasp.netjquery-eventsajaxcontroltoolkit

ASP.Net Ajax Control Toolkit "UpdatePanelAnimationExtender" breaking jQuery focus() onload


I have the following update panel with a text field limited to 9 characters only accepting numbers.

 <asp:UpdatePanel ID="updatePanelsearchusers" runat="server" UpdateMode="Always">
    <ContentTemplate>
        <div class="formfieldarea">
            <div id="searchfield1" class="searchfieldbox">
                <asp:Label ID="USIDSearchlbl" runat="server" Text="USID: " CssClass="formlabel" />
                <asp:TextBox ID="USIDSearchBox" runat="server" MaxLength="9" />
                <cc1:FilteredTextBoxExtender ID="FilteredTextBoxExtender1" runat="server" TargetControlID="USIDSearchBox" ValidChars="0123456789" />
                <asp:ImageButton ID="USIDsearchbutton" runat="server" ImageUrl="/tissuebank/images/searchButton.png" CausesValidation="true" OnClick="search1_Click" CssClass="searchbutton" />
            </div>
        </div>
        <div>{output from search}</div>
    </ContentTemplate>
 </asp:UpdatePanel>

And the following JavaScript which will automatically trigger the search button if the number of characters reaches 9.

 <script type="text/javascript" language="javascript">
    function setupUSIDFocus() {
        $('#<%=USIDSearchBox.ClientID %>').focus().keyup(function () { 
           if ($(this).val().length == 9) { 
                $('.searchbutton').first().click(); 
           } 
        });
    }
    $(document).ready(function () { setupUSIDFocus(); });
 </script>  

If I have the code as above this works fine and loads with the focus being on the element USIDSearchBox as I intended, however when the update panel is updated but the event is no longer assigned to the box and the focus is lost. To fix this I added an ASP.Net Ajax control UpdatePanelAnimationExtender so that the focus and events are reassigned when the request is complete.

  <AjaxControlToolkit:UpdatePanelAnimationExtender ID="upae" runat="server" TargetControlID="updatePanelsearchusers">
      <Animations>
          <OnUpdated>
              <Sequence>
                  <Parallel duration="0">
                      <ScriptAction Script="setupUSIDFocus();" />   
                  </Parallel>             
              </Sequence>
          </OnUpdated>
      </Animations>        
  </AjaxControlToolkit:UpdatePanelAnimationExtender>

And indeed this does reset the focus and the keyup event but for some reason the element does not get focus when the page is first loaded. Though the keyup event is still attached onload I am just missing the focus being on the USIDSearchBox field. If I remove the UpdatePanelAnimationExtender then I get the focus back on load, so it must be something to do with this control.

Does anyone have any idea how to get the focus onload of the page?


Solution

  • Alternatively, you can use 'ScriptManager.RegisterStartupScript' in 'search1_Click' to call the jQuery function after ajax update:

    ScriptManager.RegisterStartupScript(this,this.GetType(),"myscript","setupUSIDFocus();",true);