重定向后Ajax函数不保存滚动位置
Posted
技术标签:
【中文标题】重定向后Ajax函数不保存滚动位置【英文标题】:Ajax function not saving scroll position after redirection 【发布时间】:2017-11-16 06:05:39 【问题描述】:正如标题所述,我编写了一个 ajax 函数,它应该滚动到用户在被重定向之前所在的位置。
我为测试场景写了一个alert
,它确实触发了,但滚动一直回到顶部,我在这里做错了吗?
$.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 页面,包括 <html>
、<body>
标记等——如果你把它放在另一个元素中,比如 <div>
,它会使你的页面无效——你不能嵌套 <html>
标记。如果您想使用 ajax,您应该使用 WebMethod(或其他类型的 Web 服务)来仅返回应该实际插入到元素中的 HTML。
【讨论】:
我无法在 $("#") 的代码隐藏中访问我的任何变量。怎么会? 不知道这是什么意思?为什么您希望从 javascript 访问代码隐藏变量?你想做什么? 好吧,我无法在 javascript 中解析“myLink”,那我应该在里面放什么?<%= myLink.ClientID %>
应该获得由 ASP.NET 生成的h1
超链接的 ID。我假设这发生在 .aspx
或 .ascx
文件中?
´h1.ID = "myLink";´ 您说的是 h1(数字一)而不是字母 l。这是两个不同的超链接吗?是的,它是一个 .aspx 文件以上是关于重定向后Ajax函数不保存滚动位置的主要内容,如果未能解决你的问题,请参考以下文章