onbeforeunload事件不会在单击浏览器按钮时触发,而是在CMD + R / F5上运行

道格拉斯·斯尼克(Douglas Snitker)

我确定我缺少相对简单的东西-但是我一生中找不到答案。尝试在中进行防止重载时,按浏览器菜单(Chrome)中的重载按钮时react,我的onbeforeunload功能无法启动。如果我按CMD + R / F5键,并且一旦完成一次,它就会起作用-浏览器按钮也会触发该功能。如果我尝试先单击“重新加载”,它根本不起作用。此外,如果我一次浏览路由器,它似乎也会注册。我正在使用以下代码在顶层模板上注册刷新:

class Template extends React.Component {
    constructor(props) {
        super(props);
    }

    refreshPrevent = (e) => {
        e.preventDefault();
        e.returnValue = true;
    }

    componentDidMount() {
        console.log("registering refresh handlers");
        window.addEventListener("beforeunload", this.refreshPrevent );
    }

    componentWillUnmount() {
        window.removeEventListener("beforeunload", this.refreshPrevent);
    }

任何想法,将不胜感激。

h

在您的代码中看不到任何错误。我在我的react应用程序中使用了类似的代码,但是直到您发布为止,我才测试过此特定问题。

根据MDN文档,此行为似乎是正常的:

为了消除不必要的弹出窗口,除非与页面进行了交互,否则某些浏览器不会显示在beforeunload事件处理程序中创建的提示。而且,有些根本不显示它们。

因此,当您的应用首次加载时,直到您以某种方式与页面交互之前,您可以单击浏览器刷新按钮,并且取决于浏览器,页面将重新加载而不显示提示。

但是,一旦使用鼠标或键盘或通过触摸在页面上完成了某些操作,就会显示提示。

MDN文档的结论是(强调):

还要注意,各种浏览器都忽略事件的结果,根本不要求用户进行确认。在这种情况下,文档将始终自动被卸载。Firefox在about:config中有一个名为dom.disable_beforeunload的开关来启用此行为。从Chrome 60开始,如果用户自加载框架或页面以来未在其中执行手势,则该确认将被跳过。

符合我们期望某些情况的规范,例如页面未交互以及刷新,从而跳过了提示用户的操作:

鼓励用户代理避免要求用户进行确认,如果它认为这样做会令人讨厌,欺骗或毫无意义。一个简单的试探法可能是,如果用户尚未与文档进行交互,则用户代理在卸载文档之前不会要求确认。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Javascript 的 ajax 不会在浏览器的后退按钮上运行

JS opener.parent不会在ipad Safari浏览器上触发

Chrome / Internet Explorer浏览器刷新(F5,Ctrl + R,刷新箭头等)在远程服务器上使用Angular(2+)项目无法正常工作

XPages extlib 移动控件中包含的按钮的 onComplete 不会在移动设备上触发,但在桌面浏览器中工作正常

刷新页面时如何防止重新提交表单(F5 / CTRL + R)

Socket.io不会在我的React App中的浏览器后退按钮上断开连接

简单的网页不会在 xbox one edge 浏览器上运行

浏览器的“ F5”和“ Ctrl + F5”刷新会产生什么请求?

当我运行Npm Start时,React页面不会在浏览器中实时更改

Qt(通过Common Lisp的qtools):QLineEdit不会在单击时激活,而是集中在TAB上

在注册表单上,表单字段不会在提交时自动保存在浏览器中。(ReactJs)

Visual Studio 运行但不使用开始按钮或 F5 生成

区分F5或打开浏览器

Masonry在moblie浏览器(chrome)上不起作用,并且仅当我重新加载(ctrl + f5)页面而不在刷新(f5)上时才在Chrome桌面版本上起作用

jQuery-行单击事件不会在新添加的表行上触发

jQuery on()不会在动态生成/单击的单选按钮上触发

为什么从浏览器F5时Angular5会调用api?

innerHTML不会在Materialize中更改浏览器上的文本

SVG文本不会在移动浏览器上更新

CKEditor 4.4.7不会在任何移动浏览器上显示

JSF 标签 (xHTML) 不会在浏览器上呈现为 HTML

如何区分刷新(通过F5 /刷新按钮)和关闭浏览器?

音频事件不会在播放事件上触发jquery

默认的MVC5应用程序不会在浏览器VS Express 2013中以调试模式运行

Javascript 单击侦听器,但不会在子元素上触发?

Google Chrome浏览器中的F5刷新和Shift + F5有什么区别?

jQuery change事件不会在指定的选择器上触发

只有在我按F5时,脚本才能在浏览器中工作

不会在TextInputEditText android上触发onClick事件