【问题标题】:Browser does not remember position of page last viewed浏览器不记得上次查看页面的位置
【发布时间】:2010-11-15 23:19:58
【问题描述】:

我已经对这个问题进行了一些搜索,但我空手而归。我希望有人可以为我澄清事情并为我指明正确的方向。

问题:我有一个页面,在提交搜索表单后会显示结果列表。当用户单击其中一个结果时,浏览器会转到显示有关结果的更多信息的新页面。当用户然后单击“返回”按钮以打包到结果时,我的浏览器会重新加载页面并显示页面顶部,而不是上次单击的结果。

目标:我想要的是:当用户点击后退按钮时,浏览器应该返回上一页,而不是显示页面顶部,而是显示页面在前一个位置。

解决方案:我完全不知道如何实现这个结果。它是否与 javascript 或发送到浏览器的标头有关,可能与缓存有关。

【问题讨论】:

    标签: browser header scroll-position


    【解决方案1】:

    如果这非常很重要,我建议调查以下内容:

    • ids 添加到每个传出链接
    • 使用 JavaScript 捕获链接的 onClick
    • 点击链接时,将用户重定向到该链接的id fragment identifier,然后根据需要链接出去

    当用户点击后退按钮时,他们将返回到该特定链接,例如http://www.example.com/#link27 而不是 http://www.example.com/

    你或许可以从这里得到一些想法:

    【讨论】:

    • 所以伪代码看起来像这样: 1. 用户点击结果列表中的一个链接。 2. onClick 事件从被点击的链接中调用。 3. 事件调用的函数获取链接的id。 4. 该函数将页面重定向到结果页面,并将链接的 id 附加到地址末尾 5. 结果页面重新加载后,该函数将页面重定向到包含更多结果信息的页面。你是这个意思吗?我可以看到它是如何工作的,但是最好找到一种更直接的方法而不必再次重新加载结果页面
    • 是的,完全正确。是的,这很复杂。
    • @VinkoCM,不需要重新加载整页。在大多数浏览器上,在同一页面的片段之间移动应该几乎是即时的。
    【解决方案2】:

    您可以使用 javascript 和 jquery 设置窗口的滚动位置,并使用 cookie 存储滚动到的位置。在带有搜索结果的页面的 javascript 中,您可能会有这样的内容:

    var COOKIE_NAME = "scrollPosition";
    $(document).ready( function() {
    
        // Check to see if the user already has the cookie set to scroll
        var scrollPosition = getCookie(COOKIE_NAME);
        if (scrollPosition.length > 0) {
            // Scroll to the position of the last link clicked
            window.scrollTo(0, parseInt(scrollPosition, 10));
        }
    
        // Attach an overriding click event for each link that has a class named "resultLink" so the
        // saveScrollPosition function can be called before the user is redirected.
        $("a.resultLink").each( function() {
            $(this).click( function() { 
                saveScrollPosition($(this));
            });
        });
    
    });
    
    // Get the offset (height from top of page) of the link element
    // and save it in a cookie.
    function saveScrollPosition(link) {
        var linkTop = link.offset().top;
        setCookie(COOKIE_NAME, linkTop, 1);
    }
    
    // Boring cookie helper function
    function getCookie(name) {
        if (document.cookie.length > 0) {
            c_start = document.cookie.indexOf(name + "=");
            if (c_start != -1) {
                c_start = c_start + name.length + 1;
                c_end = document.cookie.indexOf(";", c_start);
                if (c_end ==- 1) c_end = document.cookie.length;
                return unescape(document.cookie.substring(c_start, c_end));
            }
        }
        return "";
    }
    // Another boring cookie helper function
    function setCookie(name, value, expiredays) {
        var exdate = new Date();
        exdate.setDate(exdate.getDate() + expiredays);
        document.cookie = name + "=" + escape(value) +
            ((expiredays==null) ? "" : ";expires=" + exdate.toGMTString());
    }
    

    这假设您的搜索结果链接有class="resultLink"

    【讨论】:

      【解决方案3】:

      答案的第一部分是您使用锚点登陆页面顶部以外的某个位置。因此,如果我在页面底部的 html 中有这个:

      <a name="f"></a>
      

      然后我可以通过将锚点附加到他的网址末尾来让用户登陆:

      http://www.bullionvalues.com/glossary.aspx#f
      

      因此,如果您在谈论 ASP.Net,您可以将锚点放在页面信息页面上的隐藏字段中,然后使用 Page.PreviousPage 属性从搜索页面中读取它。

      protected void Page_Load(object sender, EventArgs e)
      {
          if (Page.PreviousPage != null)
          {
              Object o = PreviousPage.FindControl("hfAnchor");
              if (o != null)
              {
                  HiddenField hf = o as HiddenField;
                  Response.Redirect(Request.Url+"#"+hf.Value);
              }
          }
      }
      

      【讨论】:

      • 不幸的是,我正在使用 PHP,我对 ASP.NET 一无所知
      【解决方案4】:

      我通过使用 php.ini 发送标头解决了这个问题。这是我的解决方案:

      header("Expires: 0");
      header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
      header("Cache-Control: store, cache, must-revalidate");
      header("Cache-Control: post-check=0, pre-check=0", FALSE);
      

      感谢大家的帮助。

      【讨论】:

      • 你知道为什么会这样吗?如果浏览器必须返回并访问 Web 服务器以获取内容,为什么它更有可能在返回按钮上保留页面状态信息?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多