【问题标题】:Reload (fresh-load) previous page when back button is used使用后退按钮时重新加载(重新加载)上一页
【发布时间】:2014-03-30 14:47:13
【问题描述】:

我们的 Sharepoint Web 应用程序中的所有页面都使用表单,并且我们要求在用户到达页面时必须将表单重置(恢复为默认值)。我们已经有了在页面首次加载时运行的代码(它运行if(!Page.IsPostback)),它使用必要的默认值填充表单。

但是,当使用后退按钮时,此行为会被破坏。表单保留上次访问页面时使用的值。我相信这是因为后退按钮不会重新加载页面,而只是将其从缓存中恢复。

建议的解决方案是让后退按钮强制重新加载前一页的 URL。这是我的代码:

//$(window).unload(function () { //does not work in Firefox
$(window).bind('beforeunload', function () {

    // when the back button is hit, obtain the 
    // URL of the prev. page (document.referrer)
    // and manually navigate to it forcing the page to reload
    try {
        if (document.referrer) {
            window.event.returnValue = false;
            window.location = document.referrer + "?q=" + $.now();
        }
    }
    catch (e) {
        // unload will also be triggered during a postback, 
        // at which time an "Access Denied" error will be 
        // thrown for the usage of window.location. This error 
        // can be ignored, since this is the right behaviour.
    }
});

此代码未按预期工作。

  • document.referrer 并不总是在 IE 中工作,并返回 NULL 通常,而不是上一页的 URL。
  • 在 IE9 中,分配给window.location 会引发“未指定错误”。
  • window.unload在页面刷新时也会触发, 选项卡已关闭,或使用了书签链接等,此时 上面的代码不应该被执行。

我正在寻找一种万无一失的方法:

  1. 将卸载期间的后退按钮与其他卸载技术区分开来。
  2. 获取上一页的 URL

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您可以在导航到下一页或卸载之前设置一个变量。然后,您可以在从现金重新加载脚本时简单地检查此变量并采取相应措施。可能您也可以为此使用防伪令牌,这样您就可以检查表单是否合法。虽然我不知道 SharePoint 是否支持这一点。

    【讨论】:

      【解决方案2】:

      最简单的方法(但不幸的是不是万无一失的,该死的早点IE)是将表单的autocomplete属性设置为off。这通常可以防止保留过去的值,无论是在刷新还是通过历史记录返回时。旧版本的 IE 和几乎所有浏览器的一些非常旧的版本都会忽略这一点,但 nearly every modern browser 会在每次显示页面时清除表单。

      除此之外,HTMLInputElement 确实有一个 defaultValue property that contains the original value set in the HTML source - 您可以在文档准备好时遍历所有输入元素并设置 input_elm.value = input_elm.defaultValue 这应该用您的源实际指定的任何内容覆盖自动完成值。

      【讨论】:

        【解决方案3】:

        将此代码添加到我的 HTML 对我来说效果很好:

        <input id="isOld" type="hidden" />
        <script>
            setTimeout(function () {
                var el = document.getElementById('alwaysFetch');
                el.value = el.value ? location.reload() : true;
            }, 0);
        </script>
        

        它为隐藏的输入分配一个值,在单击后退按钮后将保留该值,在这种情况下页面会被强制刷新。

        但尚未确认它是否适用于所有主要浏览器。

        【讨论】:

          猜你喜欢
          • 2012-11-14
          • 1970-01-01
          • 2013-10-13
          • 1970-01-01
          • 2011-06-05
          • 1970-01-01
          • 2016-02-24
          • 2012-02-22
          • 2014-02-17
          相关资源
          最近更新 更多