【问题标题】:window.onbeforeunload executed on page refresh instead of on page closewindow.onbeforeunload 在页面刷新而不是页面关闭时执行
【发布时间】:2013-12-23 09:34:48
【问题描述】:

我正在使用window.onbeforeunload 在发生关闭事件时弹出确认对话框,但确认对话框出现在页面刷新时并且不会在页面关闭时执行。

这是 JavaScript 代码:

<script language="JavaScript">
    window.onbeforeunload = confirmWinClose();
    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }    
</script>

我在 Chrome、Firefox 和 Internet Explorer 上尝试过。

【问题讨论】:

  • 只是关心可能设置 window.onbeforeunload = confirmWinClose();这个导致的问题改为设置它 window.onbeforeunload = confirmWinClose;
  • 好的,这会阻止代码在页面刷新时执行,但它仍然不会在页面关闭时执行!!
  • 不能onbeforeunload 中使用confirm。这不是它的工作原理。您需要让onbeforeunload 返回一个字符串。该字符串将由浏览器在其自己的确认框中显示。 onbeforeunload 不同于“正常”事件。
  • 您实际上可以做到这一点。确认对话框将简单地使用确认中的文本...confirm('[this text]')。就像返回一个字符串一样。他们会做同样的事情。

标签: javascript onbeforeunload


【解决方案1】:

您的代码有问题:

这个函数会在你refresh时被调用,因为on refresh the page is unloaded and then reloaded

在您的解决方案中,您还应该注意,您没有将function 分配给window.onbeforeunload,而是在您编写时分配了return value of the function

window.onbeforeunload = confirmWinClose();

每当分配完成时,它也可能会执行该函数(基于您在 javascript 中放置它的位置)。例如

function confirmWinClose() {
var confirmClose = confirm('Close?');
return confirmClose;
}

window.onbeforeunload = confirmWinClose();

只要这个js被加载,上面的代码就会执行confirmWinClose函数。

(不是你的情况,因为你在调用后定义了函数,所以不会在加载时执行,但你应该记住这一点)

解决方案:

以下解决方案也适用于close

我尝试了这个,而不是你的解决方案

JS:

window.onbeforeunload = function() {
    var confirmClose = confirm('Close?');
    return confirmClose;
}

 window.onbeforeunload = confirmWinClose; //note the absence of calling parantheses

    function confirmWinClose() {
        var confirmClose = confirm('Close?');
        return confirmClose;
    }

这按预期工作。

还请注意,您应该从onbeforeunload 明确地return

即使你必须调用一个函数,你也应该这样做

<script>
    window.onbeforeunload = function(e) {
       callSomeFunction();
       return null;
    };
</script>

【讨论】:

  • @JavaPlayer 再次检查编辑。没有改变?当我关闭窗口时,我可以看到对话框
【解决方案2】:

没有完整的解决方案,但是可以截取F5键(如果用户点击刷新浏览器按钮则不截取...)

var isRefresh = false;

// with jquery

$(function() {
  $(document).on("keydown", function(e) {
    if (e.which === 116)
    {
      isRefresh = true;
    }
  });
});

window.onbeforeunload = function() {
 if (! isRefresh)
 {
   return confirm ('Close ?');
 }
 return false;
};

【讨论】:

  • 关于它没有在页面关闭时执行
  • @Paul,顺便说一句,有没有机会控制浏览器的刷新?谢谢。
【解决方案3】:

既然您无论如何只想显示您的文本,那么只使用预期的 onbeforeunload 只是返回字符串?

<script language="JavaScript">
  window.onbeforeunload = confirmWinClose;
  function confirmWinClose() {return "close?";}
</script>

【讨论】:

    【解决方案4】:

    试试这个,它会起作用的。您正在将方法分配给需要在事件发生时执行的 onload,因此它需要像对象一样。请参阅链接以获得更好的解释 - var functionName = function() {} vs function functionName() {}

     window.onbeforeunload = confirmWinClose;
     function confirmWinClose () {
     var confirmClose = confirm('Close?');
     return confirmClose;
     };
    

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      相关资源
      最近更新 更多