“maintainScrollPositionOnPostBack=”true“” 在谷歌浏览器上无法正常工作。

10
任何一种上面提到的4种方式都不能在Google Chrome浏览器中使用。在Firefox浏览器中可以正常工作。请提供任何解决方案。
以下是4种不同级别的页面维护滚动条位置的代码:
1. Web.config 级别 => <pages maintainScrollPositionOnPostBack="true" /> 2. 页面级别 => <%@ Page MaintainScrollPositionOnPostback="true" %> 3. 代码级别 => Page.MaintainScrollPositionOnPostBack = true; 4. 浏览器级别 => <browser id="Chrome" parentID="Safari1Plus"> capabilities> capability name="supportsMaintainScrollPositionOnPostback" value="true" /> capabilities> browser>

你将不得不实现自己的方法。https://dev59.com/qmHVa4cB1Zd3GeqPlUcT#9607425 - Yuriy Galanter
对于现在(或以后)来到这里的任何人,至少在Google Chrome中似乎支持页面级别的添加。 - James Skemp
3个回答

7
你可以在你的ASP.NET页面/母版页中添加以下代码片段(需要jQuery):
<asp:HiddenField runat="server" ID="hfPosition" Value="" />
<script type="text/javascript">
    $(function () {
        var f = $("#<%=hfPosition.ClientID%>");
        window.onload = function () {
            var position = parseInt(f.val());
            if (!isNaN(position)) {
                $(window).scrollTop(position);
            }
        };
        window.onscroll = function () {
            var position = $(window).scrollTop();
            f.val(position);
        };
    });
</script>

对于任何使用ajax调用的人来说,window.onload不会运行,因此滚动永远不会发生。相反,我建议使用特殊的asp.net函数pageLoad。function pageLoad() {var position = parseInt(f.val());if (!isNaN(position)) {$(window).scrollTop(position);}} - Eirik H

2

无论我尝试了什么,我都无法使MaintainScrollPositionOnPostback正常工作。基于Darkseal的答案和Eirik H的评论,我尝试了下面的代码,这对我起作用了。只有当您的页面上有一个ASP.NET ScriptManager(即MicrosoftAjax.js)时,才能正常工作。您还需要添加JQuery到您的页面。将以下代码添加到您的.aspx文件中,在asp:ScriptManager标记下方的某个位置。

<asp:HiddenField runat="server" ID="hfPosition" Value="" />
<script type="text/javascript">
    $(function () {
        var positionField = $("#<%=hfPosition.ClientID%>");
        window.onscroll = function () {
            var position = $(window).scrollTop();
            positionField.val(position);
        };
    });

    function pageLoad() {
        var positionField = $("#<%=hfPosition.ClientID%>");
        var position = parseInt(positionField.val());
        if (!isNaN(position)) {
            $(window).scrollTop(position);
        }
    };
</script>

基本上,我们将滚动位置保存在名为 hfPosition 的隐藏字段的值中。每当页面滚动时,该值将被更新。然后当发生回发时,pageLoad() 将自动被调用并获取 hfPosition 的值并滚动到该值。

包括 ScriptManager 和 JQuery,我的最终代码片段看起来像这样:

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<script src="../Scripts/jquery-3.3.1.min.js" type="text/javascript"></script>
<asp:HiddenField runat="server" ID="hfPosition" Value="" />
<script type="text/javascript">
    $(function () {
        var positionField = $("#<%=hfPosition.ClientID%>");
        window.onscroll = function () {
            var position = $(window).scrollTop();
            positionField.val(position);
        };
    });

    function pageLoad() {
        var positionField = $("#<%=hfPosition.ClientID%>");
        var position = parseInt(positionField.val());
        if (!isNaN(position)) {
            $(window).scrollTop(position);
        }
    };
</script>/>

2

我也曾遇到同样的问题。我在这里找到了一个 JavaScript 解决方案

<script type = "text/javascript">
window.onload = function () {
    var scrollY = parseInt('<%=Request.Form["scrollY"] %>');             
    if (!isNaN(scrollY)) {
        window.scrollTo(0, scrollY);
    }
};
window.onscroll = function () {
    var scrollY = document.body.scrollTop;
    if (scrollY == 0) {
        if (window.pageYOffset) {
            scrollY = window.pageYOffset;
        }
        else {
            scrollY = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
        }
    }
    if (scrollY > 0) {
        var input = document.getElementById("scrollY");
        if (input == null) {
            input = document.createElement("input");
            input.setAttribute("type", "hidden");
            input.setAttribute("id", "scrollY");
            input.setAttribute("name", "scrollY");
            document.forms[0].appendChild(input);
        }
        input.value = scrollY;
    }
};

我希望这能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接