【问题标题】:javascript window.onbeforeunload not working correctlyjavascript window.onbeforeunload 无法正常工作
【发布时间】:2012-11-02 10:46:58
【问题描述】:

更新:我试图让 onbeforeunload 工作的页面出现问题。我在布局中设置了它,除了那个页面之外的每个页面都会弹出它......所以必须有一些损坏的javascript,或者重新定义onbeforeunload的javascript文件。因为它只能定义一次

我正在处理一个 Rails 项目,我正在设置一个弹出窗口来提醒用户如果他们离开页面而不保存,他们的数据将会丢失。所以我正在使用 window.onbeforeunload

我通过将此脚本代码添加到视图文件的顶部来将其设置在一个页面上

var saving = false;

window.onbeforeunload = function(){
    if(!saving)
      return 'Are you sure you don\'t want to save before you leave?';
};

如果用户点击保存按钮,则保存设置为 true,这会将他们重定向到单独的页面。

当我尝试在单独的视图文件上设置完全相同的东西时,问题就出现了,它也需要相同的功能。

除非我将上面的代码放入文件中,否则根本不会出现任何弹出窗口......在任何时候。因此,我查看了其他可用选项来设置 onbeforeunload 功能。

所以我目前将其设置为:

var saving = false;

window.onbeforeunload = displayConfirm();

function displayConfirm(){
    if(!saving){
      if(confirm('If you leave without saving, your changes will be lost. Press cancel to go back to save')){
        confirmExit();
      }
    }
}

在第二页。我的问题是这里的弹出窗口与第一个实现不同。更奇怪的是,弹出窗口出现在窗口加载...而不是在窗口卸载之前。

我已经环顾四周,搞砸了几个小时。我开始变得非常恼火,因为这应该是一个简单的补充。看看它是如何在单独的页面上设置的,并且工作正常。任何关于可能出错的见解,或者如果我犯了一个愚蠢的错误,将不胜感激。

谢谢,

-艾伦

【问题讨论】:

    标签: javascript onbeforeunload


    【解决方案1】:

    试试

    window.onbeforeunload = displayConfirm;
    

    您实际上是立即调用该函数并将displayConfirm() 的返回值分配给window.onbeforeunload。

    更新 但是您的 onbeforeunload 函数中只能使用一个 return 语句,请参阅 here。所以调用“确认”或其他一些自定义函数不起作用。

    【讨论】:

    • 好的,谢谢。这更有意义为什么它在窗口加载时被触发。我只是不明白为什么一页与代码一起使用,而另一页则不……超级奇怪。我正在 Firefox 中进行测试,并且我的第一个实现正在运行。只有当我将它添加到另一个页面时,我才无法发生同样的事情。
    • 不幸的是,您提供的解决方案给了我与以前相同的结果。弹出窗口显示在窗口加载的位置,现在如果我在框中按确定,它会破坏页面上的所有 javascript...
    • 那是我最初引用的网站,然后按照我上面的帖子中的说明设置了第一页。我唯一添加的是,如果用户点击保存按钮,它不会弹出......我不明白的是为什么当我将相同的 EXACT 代码添加到第二页时它没有做任何事情。 ..
    • 您确定没有其他错误发生吗?也许查看 chrome web 检查器控制台?放置window.onbeforeunload函数的javascript是否正确加载?
    • 这是一个相当大的项目,我被派去解决所有问题。问题是我和最初开发它的人没有联系,基本上没有cmet。我想可能发生的事情是上面的一些javascript代码被破坏了,所以下面的代码不起作用。唯一的问题是所有其他javascript代码都在定义onbeforeunload的地方工作......我一直在使用firebug。
    【解决方案2】:

    1) window.onbeforeunload = displayConfirm(); -- 你是在触发函数,而不是分配它

    2) onbeforeunload 很棒,但在很多方面都不受支持。有些浏览器甚至没有它,句号(例如,除了最新的 Opera 之外的所有浏览器),所以如果你是为广大观众做这个,或者你需要它 100% 跨浏览器工作,onbeforeunload 是遗憾的是,仅靠自己还不够。

    【讨论】:

    • 如您所知,我对使用其中一些事件处理程序很陌生。您能否指导我到任何他们可以更好地实现更可靠的跨浏览器兼容性的地方
    【解决方案3】:

    最近我正在使用这个事件做一个项目,所以我在网上做了一些搜索。 使用 onbeforeunload 事件时需要考虑的事项很少。

    1. 并非所有浏览器都支持。 Opera,尤其是旧版本。 有些部分支持它,例如按下刷新按钮时不触发。
    2. 使用该事件会导致页面不会被缓存。

    这里是Patrick Hunlock 对onbeforeonload 事件更详尽的文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多