重定向后Ajax函数不保存滚动位置

Posted

技术标签:

【中文标题】重定向后Ajax函数不保存滚动位置【英文标题】:Ajax function not saving scroll position after redirection 【发布时间】:2017-11-16 06:05:39 【问题描述】:

正如标题所述,我编写了一个 ajax 函数,它应该滚动到用户在被重定向之前所在的位置。

我为测试场景写了一个alert,它确实触发了,但滚动一直回到顶部,我在这里做错了吗?

javascript

$.ajax(
        type: "GET",
        url: "AdminListUsers.aspx?column=Disabled&direc=False&a=chstat&z=+",
        success: function loadDoc() 
            window.scrollTo(window.pageXOffset, window.pageYOffset);
        
    );

C#:

var toggleUrl = "AdminListUsers.aspx?column=" + (IsClicked.FirstOrDefault().Key ?? "Name") + "&direc=" + (IsClicked.FirstOrDefault().Value) + "&a=chstat&q=" + id.ToString() + "&d=" + disabled + "&z=" + Server.UrlEncode(txtSearchFor.Text);

var hl = new HyperLink();
hl.Text = status;
hl.Style.Add(htmlTextWriterStyle.Color, (disabled ? "red" : "green"));
hl.NavigateUrl = toggleUrl;
hl.Attributes.Add("onclick", "loadDoc();return true;");
cell.Controls.Add(hl);
tr.Cells.Add(cell);

【问题讨论】:

删除所有xhttp 引用和success 处理程序中的if 语句。只需将window.scrollTo() 呼叫放在那里即可。 @RoryMcCrossan 查看更新后的问题。这是你的意思吗?因为这也不起作用。 是的,至少现在在语法上是正确的。当你说它不起作用时,会发生什么? @RoryMcCrossan 我的意思是它不会滚动到当前位置,它只是再次向上滚动,就像您第一次刷新页面一样。尽管如此:如果我指定我希望它滚动到最底部,它确实如此,所以为什么滚动位置的值未定义很奇怪。 这里有一个几乎相同的问题:***.com/questions/44520790/… 【参考方案1】:

问题是因为它实际上是导航到超链接中指定的链接。然后它也尝试执行 ajax 请求。

如果要使用 ajax,则无需指定 navigateURL,并且脚本需要抑制超链接的默认行为。否则,您将同时获得一个完整的页面刷新一个 jQuery ajax 请求。既然你已经安装了 jQuery,你可以像这样最容易地做到这一点:

C#:

var hl = new HyperLink();
hl.Text = status;
hl.ID = "myLink";
hl.Style.Add(HtmlTextWriterStyle.Color, (disabled ? "red" : "green"));
hl.NavigateUrl = "#";
cell.Controls.Add(hl);
tr.Cells.Add(cell);

JS(使用不显眼的事件处理):

$(document).ready(function() 
  $("#<%= myLink.ClientID %>").click(function(event)  
    event.preventDefault(); //stop the normal behaviour of the link
    $.ajax(
      type: "GET",
      url: "AdminListUsers.aspx?column=Disabled&direc=False&a=chstat&z=+",
      success: function() 
        window.scrollTo(window.pageXOffset, window.pageYOffset);
      
    );
  );
);

这将阻止链接导致整个页面被重定向,并且只允许通过 ajax 加载内容。

注意如果要在一个表中创建多个超链接实例,则需要使用类而不是 ID 来允许 jQuery 定位它。

但是,我会质疑 "AdminListUsers.aspx?column=Disabled&direc=False&a=chstat&z=+" 实际返回的内容。通常,一个 aspx 页面会返回一个完整的 HTML 页面,包括 &lt;html&gt;&lt;body&gt; 标记等——如果你把它放在另一个元素中,比如 &lt;div&gt;,它会使你的页面无效——你不能嵌套 &lt;html&gt; 标记。如果您想使用 ajax,您应该使用 WebMethod(或其他类型的 Web 服务)来仅返回应该实际插入到元素中的 HTML。

【讨论】:

我无法在 $("#") 的代码隐藏中访问我的任何变量。怎么会? 不知道这是什么意思?为什么您希望从 javascript 访问代码隐藏变量?你想做什么? 好吧,我无法在 javascript 中解析“myLink”,那我应该在里面放什么? &lt;%= myLink.ClientID %&gt; 应该获得由 ASP.NET 生成的h1 超链接的 ID。我假设这发生在 .aspx.ascx 文件中? ´h1.ID = "myLink";´ 您说的是 h1(数字一)而不是字母 l。这是两个不同的超链接吗?是的,它是一个 .aspx 文件

以上是关于重定向后Ajax函数不保存滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

ajax请求返回django.urls.exceptions.NoReverseMatch后Django反向和重定向

如何在AD上重定向电脑加域后默认保存位置?

CORS XHR 重定向不起作用

页面重定向后的Jquery函数?

Django之重定向

从 jquery ajax statuscode 401 获取位置重定向 url