Таймер запуска обновления панели обновления вызывает потерю фокуса - PullRequest
3 голосов
/ 25 января 2012

Я сделал часы для отображения текущего времени с помощью таймера AJAX на панели обновления AJAX.Таймер установлен на одну минуту, вызывая событие галочки, которое помещает текущее время в метку.На странице имеется несколько текстовых полей, и когда часы обновляются, курсор переходит к элементу управления по умолчанию, а страница переходит наверх.Это затрудняет заполнение формы без перерыва.Как сохранить фокусировку и положение прокрутки?Я нашел ответ здесь Сохранение фокуса на панели обновления ajax после обновления формы , но он использует javascript без полного кода (код psuedo, как он писал).Я слаб в javascript, поэтому кто-то может дать мне более подробное решение или другую альтернативу?Спасибо.

Редактировать: Не существует ли простого способа найти, какой элемент управления имеет фокус во время обратной передачи, и сбросить фокус на этот элемент управления при перезагрузке страницы?Желательно в c # и если не в javascript.

Ответы [ 4 ]

0 голосов
/ 11 мая 2013

Ввод этого кода после вашего менеджера скриптов также решит проблему в глобальном масштабе.Я только что проверил, это прекрасно работает.

<script type="text/javascript">
    try 
    {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        function beginRequest() {
            prm._scrollPosition = null;
        }
        prm.add_beginRequest(beginRequest);


    }
    catch (err) {
        alert(err);
    }
</script>

Как видно здесь

Вот код, с которым я тестировал егоЯ только что сделал таймер обновления пустой панели обновления каждые 100 мс, чтобы было легко увидеть проблему.Если вы закомментируете <script type="text/javascript">....<script> под диспетчером сценариев, вы увидите до и после того, что прокрутить страницу вниз в некоторых браузерах практически невозможно!

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">

</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
 <asp:ScriptManager ID="ScriptManager1" runat="server" />

<script type="text/javascript">
    try 
    {
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        function beginRequest() {
            prm._scrollPosition = null;
        }
        prm.add_beginRequest(beginRequest);


    }
    catch (err) {
        alert(err);
    }
</script>


        <asp:Timer ID="Timer1" Interval="100" runat="server" />
        <asp:UpdatePanel ID="up1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
            </Triggers>
            <ContentTemplate>

            </ContentTemplate>
        </asp:UpdatePanel>

<br /><br />
        <div style="min-height:2000px"></div>


</asp:Content>
0 голосов
/ 12 февраля 2012

Я обнаружил, что проблема возникала только на страницах, где я устанавливал фокус по коду, например, txtBox.Focus (), но на страницах, где я не устанавливал фокус по коду, проблем нет. Поэтому я попытался перевести команду Focus () в состояние обратной передачи, если не.

if(!isPostback)
{
   txtBox.Focus();
}

Это решило все проблемы.

0 голосов
/ 22 декабря 2012

Ваша панель обновлений имеет ContentTemplate, но проверьте, есть ли у вас AsyncPostBackTrigger

<asp:UpdatePanel ID="updatepanel1" runat="server">
  <Triggers>
    <asp:AsyncPostBackTrigger ControlID="tmrUpdate" EventName="Tick" />
  </Triggers>
  <ContentTemplate>
    <div>content updating</div>
  </ContentTemplate>
</asp:UpdatePanel>
0 голосов
/ 31 января 2012

Моей главной проблемой было потерять фокус из текстовых полей в середине записи, когда тикают часы.У меня есть два текстовых поля, поэтому в событии тика в коде позади я проверил, если в первом есть текст, а во втором я не знаю, что фокус должен быть в первом, поэтому я даю ему Focus () и если ввторое текстовое поле, которое означает, что фокус должен быть там.Это код:

if (!string.IsNullOrEmpty(txtSolution.Text) && string.IsNullOrEmpty(txtRemarks.Text))
        {
            txtSolution.Focus();
        }
        else if (!string.IsNullOrEmpty(txtRemarks.Text))
        {
            txtRemarks.Focus();
        }

Это решило как потерю фокуса курсора, так и скачок положения прокрутки.Проблема: если пользователь закончил запись в первом текстовом поле и перешел во второе, но еще не начал писать, он вернется к первому.Или, если он перешел со второго на первое, произойдет прыжок ко второму.В остальном работает нормально.

...