2012-01-25 54 views
3

我已經做了一個時鐘來顯示ajax更新面板中的ajax定時器的當前時間。定時器設置爲一分鐘,觸發標記事件,將當前時間置於標籤中。頁面上有許多文本框,當時鍾更新光標跳到默認的焦點控制時,頁面跳轉到頂部。這使得填寫表格時無需中斷。我如何保持控制焦點和滾動位置? 我在這裏找到了一個答案Maintaining focus on ajax update panel after updating form,但它使用的是沒有完整代碼的javascript(他寫的僞代碼)。我在javascript方面很弱,所以有人能給我一個更詳細的解決方案或另一種選擇? 謝謝。定時器觸發更新面板更新導致焦點丟失

編輯:是否沒有一種簡單的方法來找到哪個控件在回發時聚焦並在頁面重新加載時將焦點重置到該控件?最好在c#中,如果不是在JavaScript中。

+1

你使用一個更新面板,其中兩個定時器,並與文本形成的?如果是這樣的使用定時器標籤和單獨的更新面板多了一個對的形式。 – sathishkumar

+0

@sathishkumar我只有一個更新面板,但只有計時器和標籤接收時間在裏面。表單的其餘部分根本不在更新面板中。 –

+0

爲什麼不使用JavaScript定時器,這樣就不會有回發效果... – Madhu

回答

0

我發現問題只出現在我通過代碼如txtBox.Focus()設置焦點的頁面上,但是沒有通過代碼設置焦點的頁面沒有問題。所以我試着把Focus()命令放在一個如果不是回發的情況下。

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

解決了所有問題。

0

我的主要問題是在時鐘滴答的時候,文字框中的文本框失去焦點。我有兩個文本框,所以在代碼後面的tick事件中,我檢查了,如果第一個文本和第二個不知道焦點應該在第一個,所以我給它的焦點(),如果有文字在第二個文本框,意味着重點應該在那裏。 這是代碼:

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

這解決了這兩個光標和滾動位置跳躍的焦點的損失。 問題:如果用戶在第一個文本框中完成了寫作並移至第二個文本框,但尚未開始寫入,則會跳回第一個文本框。或者如果他從第二名回到第一名,則會跳到第二名。否則,它工作正常。

0

你的更新面板具有的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

把這個代碼你的腳本經理後,也將在全球範圍解決問題。我剛測試過這個作品很棒。

<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> 

As seen here

這裏是我與測試了它的代碼。我只是讓計時器每100ms更新一次空的更新面板,以便很容易發現問題。如果您在腳本管理器下面註釋掉<script type="text/javascript">....<script>,您會看到之前和之後幾乎不可能在某些瀏覽器中向下滾動頁面!

Default.aspx的

<%@ 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>