javascript - 在“重新加载站点?”上单击“取消” 在 chrome 中刷新页面
问题描述
我有这个简单的代码,当用户离开或刷新页面时显示
<script>
var buttonClicked = false;
window.onbeforeunload = function () {
if (buttonClicked) {
buttonClicked = false;
}
else {
return "WARNING";
}
};
</script>
buttonClicked
如果用户单击Next并且未显示警告,则为 true。
当您单击重新加载时,此警告仍按预期显示,但单击取消仍会刷新页面,丢失表单中输入的所有数据。这只发生在 Google Chrome 77 中。我在 Firefox 和 Edge 上尝试过,但没有发生。
奇怪的是,当 DevTools 打开时,Chrome 并没有刷新页面。
这是我的错误,我错了吗?
解决方案
根据MDN 文档:
根据规范,要显示确认对话框,事件处理程序应调用
preventDefault()
事件。但是请注意,并非所有浏览器都支持此方法,有些浏览器需要事件处理程序来实现以下两种遗留方法之一:
- 将字符串分配给事件的 returnValue 属性
- 从事件处理程序返回一个字符串。
官方规范似乎希望您致电Event#preventDefault
. 然而,一些较旧的浏览器可能不尊重这一点,并要求事件处理程序返回一个字符串或设置returnValue
事件的属性。
const $preventReload = document.getElementById('prevent_reload');
window.onbeforeunload = (ev) => {
if ($preventReload.checked) {
ev.preventDefault();
ev.returnValue = 'prevented';
return 'prevented';
}
}
<lable for="prevent_reload">Prevent reload</lable> <input id="prevent_reload" type="checkbox" />
<button onclick="location.reload()">Reload page!</button>
因此,最新版本的 chrome (chrome 77) 可能取消了对后两个选项的支持,并选择仅支持官方规范。
推荐阅读
- e2e - 设置项目后找不到e2e文件,我该怎么办?
- html - 我尝试了这段代码,但我的 3 张图像之间仍然有一个小空间,我应该添加更多以删除这些空间
- python - 导入函数更改其隐式变量
- oracle - Oracle 11g 执行 PrepareStatement 列字符集问题
- javascript - 用户可以编辑我网站上的所有 javascript 吗?
- arrays - 错误代码:未捕获的类型错误:无法读取 diffArray 处未定义的属性“长度”
- mongodb - Yii2 MongoDB 查询条件或
- python - AttributeError 用于分析 python pandas 中的多个工作表
- python - n秒后跳到for循环中的下一个对象?
- merge - 在 JGit 中如何从 JGit Status 中的冲突文件列表中获取冲突数