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在页面刷新时也被触发,选项卡关闭,或使用书签链接等,此时不应执行上面的代码
我正在寻找一种防傻的方法:
- 将卸载过程中按下的后退按钮与其他卸载技术区分开来
- 获取上一页的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>
它为隐藏的输入指定一个值,该值将在单击后退按钮后保留,在这种情况下,页面将被强制刷新。
然而,它在所有主流浏览器上都能运行,这一点尚待证实。