我怎么可以复盖OnBeforeUnload对话和替换我自己?
-
07-07-2019 - |
题
我需要提醒用户关于未保存变化之前,他们留下一个网页(一个很常见的问题)。
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酒店的窗口。事件,一个对话框出现,让用户可以选择留在目前的页和保留串分配给它。默认声明中出现的对话框中,"你确定要离开这一页?...按确定的继续,或者取消留在目前的页面。", 不可去除或改变。
该问题似乎是:
- 时
onbeforeunload
被称,它将采取的返回值的处理程序window.event.returnValue
. - 然后,它将分析返回值作为string(除非它是null)。
- 由于
false
分析作为一串,在对话框火,然后将通过一个合适的true
/false
.
结果是,似乎并没有以一种方式分配 false
要 onbeforeunload
以防止其默认的对话。
附加说明在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>
如何使用“bind”的专用版本?命令“一”。一旦事件处理程序第一次执行,它就会自动作为事件处理程序删除。
$(window).one("beforeunload", BeforeUnload);