【问题标题】:Ajax function not saving scroll position after redirection重定向后Ajax函数不保存滚动位置
【发布时间】: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 我的意思是它不会滚动到当前位置,它只是再次向上滚动,就像您第一次刷新页面一样。尽管如此:如果我指定我希望它滚动到最底部,它确实如此,所以为什么滚动位置的值未定义很奇怪。
  • 这里有一个几乎相同的问题:stackoverflow.com/questions/44520790/…

标签: javascript c# jquery .net ajax


【解决方案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 文件
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 2020-03-25
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多