Как можно поддерживать фокусировку на асинхронных обратных передачах? - PullRequest
2 голосов
/ 03 августа 2010

У меня есть настройки страницы, например, так:

<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, равное нулю.

У кого-нибудь есть исправления для моего javascript или решения проблемы в целом?

1 Ответ

1 голос
/ 03 августа 2010

Здесь есть несколько проблем, которые легко решаются! Поскольку эти элементы заменяются, обработчики .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);

endRequest срабатывает при завершении aync-обратной передачи, а не только при начальной загрузке страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...