使用后退按钮时重新加载(新加载)上一页



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会抛出一个"未指定的错误">
  • CCD_ 4在页面刷新时也被触发,选项卡关闭,或使用书签链接等,此时不应执行上面的代码

我正在寻找一种防傻的方法:

  1. 将卸载过程中按下的后退按钮与其他卸载技术区分开来
  2. 获取上一页的URL

最简单的方法(但不幸的是,不是傻瓜式的,该死的早期IE)是将表单的autocomplete属性设置为off。这通常会防止在刷新或通过历史记录返回时保留过去的值。IE的旧版本,以及几乎所有浏览器的一些真正旧的版本都忽略了这一点,但几乎所有现代浏览器都会在每次显示页面时清除表单。

除此之外,HTMLInputElement确实有一个defaultValue属性,它包含HTML源中设置的原始值——您可以在文档就绪时循环所有输入元素,并设置input_elm.value = input_elm.defaultValue,它应该用源实际指定的任何内容覆盖自动完成值。

您可以在导航到下一页或卸载之前设置一个变量。然后,当脚本从现金中重新加载时,您可以简单地检查这个变量,并采取相应的行动。也许你也可以使用防伪代币,这样你就已经有了检查表格是否合法的方法。尽管我不知道SharePoint是否支持此功能。

将此代码添加到HTML中对我来说很好:

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

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

然而,它在所有主流浏览器上都能运行,这一点尚待证实。

相关内容

  • 没有找到相关文章