如何在用户离开页面之前向其请求确认,例如Gmail中的功能?
我在各种地方搜索了这个问题,但他们提到的都是使用JavaScript的 window.unload 和 window.onbeforeunload。而且在Chrome浏览器中大多数时间不起作用,因为它会被阻止。
如何在用户离开页面之前向其请求确认,例如Gmail中的功能?
我在各种地方搜索了这个问题,但他们提到的都是使用JavaScript的 window.unload 和 window.onbeforeunload。而且在Chrome浏览器中大多数时间不起作用,因为它会被阻止。
试试这个:
<script>
window.onbeforeunload = function (e) {
e = e || window.event;
// For IE and Firefox prior to version 4
if (e) {
e.returnValue = 'Sure?';
}
// For Safari
return 'Sure?';
};
</script>
这里有一个运行正常的jsFiddle
2020年最简短的解决方案(适用于不需要支持IE的幸福人群)
在Chrome、Firefox和Safari中测试通过。
function onBeforeUnload(e) {
if (thereAreUnsavedChanges()) {
e.preventDefault();
e.returnValue = '';
return;
}
delete e['returnValue'];
}
window.addEventListener('beforeunload', onBeforeUnload);
实际上,现代浏览器(Chrome、Firefox、Safari)不会将"返回值"作为问题显示给用户,而是展示它们自己的确认文本(这取决于浏览器)。但我们仍然需要返回一些(即使是空字符串)来在Chrome上触发确认。
试一下这个:
<script>
window.onbeforeunload = function(e) {
return 'Dialog text here.';
};
</script>
更多信息请查看MDN。
我看到对答案的评论被标记为“好”的。大多数用户都在询问是否允许点击按钮和某些链接。这里需要添加一行代码来实现。
<script type="text/javascript">
var hook = true;
window.onbeforeunload = function() {
if (hook) {
return "Did you save your stuff?"
}
}
function unhook() {
hook=false;
}
为了允许某些按钮和链接使用,可以在点击时调用unhook()。例如:
<a href="#" onClick="unhook()">This link will allow navigation</a>
onclick="hook = false;"
。 - undefined简单地说
function goodbye(e) {
if(!e) e = window.event;
//e.cancelBubble is supported by IE - this will kill the bubbling process.
e.cancelBubble = true;
e.returnValue = 'You sure you want to leave?'; //This is displayed on the dialog
//e.stopPropagation works in Firefox.
if (e.stopPropagation) {
e.stopPropagation();
e.preventDefault();
}
}
window.onbeforeunload=goodbye;
window.unload
或 document.pagehide
替代 onbeforeunload。 - Dev Matee如果您想根据条件进行查询:
var ask = true
window.onbeforeunload = function (e) {
if(!ask) return null
e = e || window.event;
//old browsers
if (e) {e.returnValue = 'Sure?';}
//safari, chrome(chrome ignores text)
return 'Sure?';
};
针对这三种情况,我在以下代码中进行了大量搜索,并进行了更改以适应我的需求,希望能帮助其他人。 ask是一个关键字,如果我想弹出提示,则为“true”,否则不会。假设我想打印我的文档并重定向我的页面,则ask将为false,不会有提示。 假设您的页面具有数据,则检查条件是我的情况下的小计值,如果小计为零,则不会提示,否则请提示我您的页面上有某些内容。
<pre>
var ask = true;
window.onbeforeunload = function(e) {
if (!ask) return null
var subtotal = $('#lblgtwithsgst').text();
if (subtotal != '0') {
e = e || window.event;
//old browsers
if (e) {
e.returnValue = 'Sure?';
}
//safari, chrome(chrome ignores text)
return 'Sure?';
}
}
$('#btnPrint').click(function(){
ask = false;
///print your doc no prompt if ask is false;
)};
// use jquery version older than 1.6
var preventUnloadPrompt;
var messageBeforeUnload =
'my message here - Are you sure you want to leave this page?';
$('a').live('click', function () {
preventUnloadPrompt = true;
});
$('form').live('submit', function () {
preventUnloadPrompt = true;
});
$(window).bind('beforeunload', function (e) {
var rval;
if (preventUnloadPrompt) {
return;
} else {
return messageBeforeUnload;
}
return rval;
});
对于Angular, 更改组件表单名称并将其粘贴到需要显示警报的组件中。
@HostListener('window:beforeunload', ['$event'])
beforeunloadHandler(event) {
return !this.form.dirty;
}