我需要提醒用户关于未保存变化之前,他们留下一个网页(一个很常见的问题)。

window.onbeforeunload=handler

这一工作,但它提出了一种默认的对话与一种刺激性的标准信息,包我自己的文本。我需要完全替换的标准信息,所以我的文本是明确的,或者(甚至更好的)替代在整个对话与模式对话使用的!

到目前为止,我已经失败,我还没有找到任何其他人似乎有一个答案。它甚至有可能吗?

Javascript在我的网页:

<script type="text/javascript">   
   window.onbeforeunload=closeIt;
</script>

该closeIt()function:

function closeIt()
{
  if (changes == "true" || files == "true")
  {
      return "Here you can append a custom message to the default dialog.";
  }
}

使用能力和jqModal我已经尝试过这种事情(使用一个定义确认对话):

$(window).beforeunload(function() {
        confirm('new message: ' + this.href + ' !', this.href);
        return false;
    });

这也没工作-我似乎无法结合beforeunload事件。

有帮助吗?

解决方案

你不可以修改默认的对话 onbeforeunload, ,所以你最好的选择,可以与它的工作。

window.onbeforeunload = function() {
    return 'You have unsaved changes!';
}

这里有一个参考 这个从微软:

当一串是分配给returnValue酒店的窗口。事件,一个对话框出现,让用户可以选择留在目前的页和保留串分配给它。默认声明中出现的对话框中,"你确定要离开这一页?...按确定的继续,或者取消留在目前的页面。", 不可去除或改变。

该问题似乎是:

  1. onbeforeunload 被称,它将采取的返回值的处理程序 window.event.returnValue.
  2. 然后,它将分析返回值作为string(除非它是null)。
  3. 由于 false 分析作为一串,在对话框火,然后将通过一个合适的 true/false.

结果是,似乎并没有以一种方式分配 falseonbeforeunload 以防止其默认的对话。

附加说明在jQuery:

  • 设置事件在jQuery 是有问题的,因为这可以让其他的 onbeforeunload 事件发生。如果你只想为你卸下事件发生,我会坚持到普通ol'JavaScript。
  • jQuery没有一个快捷方式 onbeforeunload 所以你必须要使用通用 bind 语法。

    $(window).bind('beforeunload', function() {} );
    

编辑09/04/2018:定义信息中onbeforeunload的对话已被否决,因为铬51(cf: 注释)

其他提示

使用 jQuery 并在IE8,Chrome和Firefox中测试过,对我有用的是:

$(window).bind("beforeunload",function(event) {
    if(hasChanged) return "You have unsaved changes";
});

如果不需要提示,则不要返回任何内容,因为IE和其他浏览器行为之间存在差异。

虽然在某些情况下你无法对盒子做任何事情,但你可以拦截某人点击链接。对我来说,这对于大多数场景都是值得的,而作为后备,我已经离开了卸载事件。

我使用的是Boxy而不是标准的jQuery Dialog,可以在这里找到: http:// onehackoranother.com/projects/jquery/boxy/

$(':input').change(function() {
    if(!is_dirty){
        // When the user changes a field on this page, set our is_dirty flag.
        is_dirty = true;
    }
});

$('a').mousedown(function(e) {
    if(is_dirty) {
        // if the user navigates away from this page via an anchor link, 
        //    popup a new boxy confirmation.
        answer = Boxy.confirm("You have made some changes which you might want to save.");
    }
});

window.onbeforeunload = function() {
if((is_dirty)&&(!answer)){
            // call this if the box wasn't shown.
    return 'You have made some changes which you might want to save.';
    }
};

你可以附加到另一个事件,并过滤更多关于点击了什么类型的锚点,但这对我和我想做的事情有用,并作为其他人使用或改进的例子。我想我会为那些想要这个解决方案的人分享这个。

我已经删除了代码,因此可能无法正常工作。

1)使用onbeforeunload,而不是onunload。

2)重要的是避免执行return语句。这并不意味着避免从你的处理程序返回。你可以返回,但你可以通过确保到达函数的末尾并且不执行return语句来实现。在这些条件下,不会发生内置标准对话框。

3)如果你使用onbeforeunload,你可以在unbeforeunload处理程序中运行ajax调用来整理服务器,但它必须是同步的,你必须等待并处理onbeforeunload处理程序中的回复(仍然遵守上述条件(2))。我这样做,它工作正常。如果你进行同步ajax调用,一切都会被阻止,直到响应回来。如果您执行异步操作,认为您不关心来自服务器的回复,则页面卸载将继续,并且此过程将中止您的ajax调用 - 包括远程脚本(如果它正在运行)。

尝试放置 return; 而不是消息..这对我来说适用于大多数浏览器。 (这只会真正阻止对话框的呈现)

window.onbeforeunload = function(evt) {            
        //Your Extra Code
        return;
}

您可以检测用户按下的按钮(确定或取消),因为只有当用户选择离开页面时才会调用onunload函数。在这个功能中,可能性是有限的,因为DOM正在崩溃。你可以运行javascript,但是ajax POST没有做任何事情,因此你不能使用这个方法来自动注销。但是有一个解决方案。 window.open('logout.php')在onunload函数中执行,因此用户将以新窗口打开注销。

function onunload = (){
    window.open('logout.php');
}

当用户离开页面或关闭活动窗口并且用户通过'logout.php'注销时,会调用此代码。 当注销php由代码组成时,新窗口立即关闭:

window.close();

我遇到了同样的问题,我可以通过我的消息获得自己的对话框,但我遇到的问题是: 1)它只是为了关闭点击而在所有导航上发出消息。 2)如果用户选择取消,我自己的确认消息仍会显示浏览器的默认对话框。

以下是我找到的解决方案代码,我在母版页上写道。

function closeMe(evt) {
    if (typeof evt == 'undefined') {
        evt = window.event; }
    if (evt && evt.clientX >= (window.event.screenX - 150) &&
        evt.clientY >= -150 && evt.clientY <= 0) {
        return "Do you want to log out of your current session?";
    }
}
window.onbeforeunload = closeMe;

现在无法使用chrome来避免垃圾邮件,请参阅 javascript onbeforeunload没有显示自定义消息以获取更多详细信息。

 <script type="text/javascript">
        window.onbeforeunload = function(evt) {
            var message = 'Are you sure you want to leave?';
            if (typeof evt == 'undefined') {
                evt = window.event;
            }       
            if (evt) {
                evt.returnValue = message;
            }
            return message;
        } 
    </script>

参考 http://www.codeprojectdownload.com

如何使用“bind”的专用版本?命令“一”。一旦事件处理程序第一次执行,它就会自动作为事件处理程序删除。

$(window).one("beforeunload", BeforeUnload);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top