web-dev-qa-db-ja.com

自動ポストバックでスクロール位置を維持する方法は?

postbackでページの同じ位置に戻るにはどうすればよいですか。常にページのトップに表示されるようです。

私はmaintainScrollPositionOnPostBack = "true"

しかし、機能していません。

22
BobLoblaw

私も最近これを探しました。私が次のことを見つけるまで、挿入されるJavascriptのロードを思いつきました。

.aspxコードファイルの先頭に、以下を挿入します。

 MaintainScrollPositionOnPostback="true"

.aspxの最初の文が始まります

<%@ Page Language="C#" MaintainScrollPositionOnPostback="true" AutoEventWireup="true" CodeBehind="Default.aspx.cs"

これは、更新パネルを使用してスクロールバーの位置を維持するための他のコードを追加する必要なく、私にとってはうまく機能します

37
bbbwex

MaintainScrollPositionOnPostBackを設定する方法はいくつかあります。複数試しましたか?何がポストバックをトリガーしているか、どのブラウザーをテストしたかを説明できますか?マスターページを使用していますか?

  1. ページの読み込み時にコードビハインドでPage.MaintainScrollPositionOnPostBack = true;を設定できます。
  2. ページ宣言に追加できます<%@ Page MaintainScrollPositionOnPostback="true" %>
  3. ウェブ設定ファイル<pages maintainScrollPositionOnPostBack="true" />に追加できます
16
K Richard

ページがポストバックするときに、特定のサーバーコントロールに.Focus()を設定できます。

6
TheGeekYouNeed

Google Chrome=テストに使用していますか?私は同じ問題を抱えていましたが、IEとFirefoxでテストを開始しましたが、動作していました。考えていません= Chromeはこのプロパティをサポートします。NETFramework 3.5の問題である可能性もあります。NET4.0で修正されている可能性があります

3
Guzumba
<script type="text/javascript">    
  var xPos, yPos;
  var prm = Sys.WebForms.PageRequestManager.getInstance();

  function BeginRequestHandler(sender, args) {
    if ($get('<%=Panel1.ClientID%>') != null) {         
      xPos = $get('<%=Panel1.ClientID%>').scrollLeft;
      yPos = $get('<%=Panel1.ClientID%>').scrollTop;
    }
 }

 function EndRequestHandler(sender, args) {
     if ($get('<%=Panel1.ClientID%>') != null) {       
       $get('<%=Panel1.ClientID%>').scrollLeft = xPos;
       $get('<%=Panel1.ClientID%>').scrollTop = yPos;
     }
 }
 prm.add_beginRequest(BeginRequestHandler);
 prm.add_endRequest(EndRequestHandler);

上記のコードをScriptManagerタグに追加し、ページ宣言にMaintainScrollPositionOnPostback="true"を追加します

0
the-a-monir

注:デフォルトのコントロールが定義されている場合、たとえページMaintainScrollPositionOnPostback = "true"であっても、ポストバック時にそのコントロールまでスクロールします。

0
RBILLC

特定のアンカーに移動したい場合は、記述されている here のような方法を使用できます。それ以外の場合は、JavaScriptを使用して上からの距離を確認し、非表示のフィールドまたはCookieに保存して、ページの読み込み後にビューをリセットする必要があります。

0
FreeAsInBeer

この質問から: 部分的なポストバックASP.NETのパネルスクロール位置を維持

MaintainScrollPositionOnPostbackの一般的な代替手段と、BeginRequestHandlerとEndRequestHandlerを使用するJavaScriptソリューションを使用して、この問題に対する答えを数日間探していました。

何も機能しませんでしたが、同じ@ waqas-rajaアルゴリズムを使用して、BeginRequestHandlerとEndRequestHandlerでjQueryを使用するかなり単純なソリューションを思い付きました。

<script type="text/javascript">

    var scrollPosition = 0;

    $(document).ready(function () {

        $(window).scroll(function (event) {
            scrollPosition = $(window).scrollTop();
        });

    });

</script>

<script type="text/javascript">

    // It is important to place this JavaScript code after ScriptManager1
    var xPos, yPos;
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    function BeginRequestHandler(sender, args) {
        console.log('BeginRequest');
    }

    function EndRequestHandler(sender, args) {
        $(window).scrollTop(scrollPosition);
    }

    prm.add_beginRequest(BeginRequestHandler);
    prm.add_endRequest(EndRequestHandler);

</script>

アイデアは、ユーザーがスクロールを移動するたびにスクロールの位置をグローバル変数にキャプチャすることです。これにより、最後の位置がどれであるかがわかり、ポストバックを作成すると、EndRequestHandlerイベントが入力され、最後の位置で更新されます。マークされたユーザー

これはFirefoxとGoogleで私のために機能しましたChrome :)

0
Julián

Bbbwexの応答は正しいですが、MaintainScrollPositionOnPostback = "true"を両方に配置する必要があることに気付くまでに実際に時間がかかりました

  1. ASPXページの上部。

  2. IsPostBack内

両方の条件を満たすと動作します。

0
joseph.c

私にとって最良の解決策は、問題のあるコントロールを更新パネルでラップすることでした

<asp:UpdatePanel runat="server" id="UpdatePanel" updatemode="Conditional">
<ContentTemplate>
dropdown controls that cause postback etc..
</ContentTemplate>
</asp:UpdatePanel>

もちろん、あなたも必要です

<asp:ScriptManager ID="ScriptManager1" runat="server" />

サイトのメインフォーム内に存在する。

0
omadawn

デフォルトのボタンを設定しないでください<form id="form1" runat="server" defaultbutton="YourDefaultButton">。削除する defaultbutton="YourDefaultButton"およびMaintainScrollPositionOnPostback="true" 働くでしょう。

0
Vladislav