2010-08-03 1 views
2

У меня есть страница настройки следующим образом:Как можно контролировать фокус в асинхронных обратных передачах?

<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 асинхронной постбэк происходит. Это, конечно же, инициируется путем перемещения фокуса на другой элемент управления после изменения текста. Проблема заключается в том, когда асинхронный postback завершает контроль, который получил фокус, теряет фокус. Неважно, находится ли она внутри панели обновления или отсутствует.

Я пытался добавить JavaScript в Masterpage:

<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

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

+0

Это похоже на работу, хотя мне также пришлось изменить RestoreFocus для поиска элемента управления на основе id. Я подозреваю, из-за того, что элементы управления на панели обновлений стали совершенно новыми? –

Смежные вопросы