如何在异步回发中保持控制焦点?

时间:2010-08-03 15:30:45

标签: asp.net jquery ajax asp.net-ajax

我的页面设置如下:

<ajax:UpdatePanel id="UpdatePanel1" runat="server" UpdateMode="Conditional">
  <ContentTemplate>
    <asp:TextBox id="TextBox1" runat="server" AutoPostBack="true"/>
    <asp:TextBox id="TextBox2" runat="server" AutoPostBack="true"/>
  </ContentTemplate>
</ajax:UpdatePanel>
<asp:TextBox id="TextBox3" runat="server"/>

每当TextBox1或TextBox2中发生更改时,都会发生异步回发。这当然是通过在更改文本后将焦点移动到不同的控件来启动的。问题是当异步回发完成控制时,获得焦点的人失去了焦点。无论是在更新面板内还是外面都无关紧要。

我尝试将javascript添加到母版页:

<script type="text/javascript">

  var lastFocused = null;

  $(document).ready(function() {

    $('input').focus(function() {
      lastFocused = this;
    });

    $('.dropdown').focus(function() {
      lastFocused = this;
    });

  });

  function RestoreFocus(source, args) {
    if (lastFocused != null)
      lastFocused.focus();
  }

  function AddRequestHandler() {
    var prm = Sys.WebForms.PageRequestManager.getInstance();
    prm.add_pageLoaded(RestoreFocus);
  }
</script>

一起
<body onload="AddRequestHandler">

我知道lastFocused正在获取一个值并且RestoreFocus正在运行,但无论何时运行,lastFocused的值都为null。

是否有人修复了我的javascript或解决问题的方法?

1 个答案:

答案 0 :(得分:1)

这里有一些问题,很容易解决!由于这些元素被替换,.focus()处理程序将不会粘住,您需要.live(),如下所示:

var lastFocused = null;
$(function() {
  $('input, .dropdown').live('focus', function() {
    lastFocused = this;
  });
});

注意:您需要jQuery 1.4.1+来支持 focus 事件 .live()

此外,您应该使用add_endRequest一次,如下所示:

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(RestoreFocus);
当aync-postback完成时,

endRequest会触发,而不是在初始页面加载时仅