我想捕获浏览器窗口/选项卡关闭事件。 我用jQuery尝试了以下内容:
jQuery(window).bind(
"beforeunload",
function() {
return confirm("Do you really want to close?")
}
)
但它也适用于表单提交,这不是我想要的。我想要一个仅在用户关闭窗口时触发的事件。
答案 0 :(得分:195)
当用户出于任何原因离开您的网页时,beforeunload
事件就会触发。
例如,如果用户提交表单,单击链接,关闭窗口(或选项卡)或使用地址栏,搜索框或书签转到新页面,则会触发它。
您可以使用以下代码排除表单提交和超链接(其他框架除外):
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
对于早于1.7的jQuery版本,请尝试以下方法:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
live
方法不适用于submit
事件,因此如果您添加新表单,则还需要将处理程序绑定到该表单。
请注意,如果其他事件处理程序取消了提交或导航,如果稍后实际关闭该窗口,您将丢失确认提示。您可以通过在submit
和click
事件中记录时间来检查这一点,并检查beforeunload
是否会在几秒钟后发生。
答案 1 :(得分:44)
也许只是取消绑定表单的beforeunload
事件处理程序中的submit
事件处理程序:
jQuery('form').submit(function() {
jQuery(window).unbind("beforeunload");
...
});
答案 2 :(得分:15)
对于跨浏览器解决方案(在Chrome 21,IE9,FF15中测试),请考虑使用以下代码,这是Slaks代码的略微调整版本:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind('beforeunload', function(eventObject) {
var returnValue = undefined;
if (! inFormOrLink) {
returnValue = "Do you really want to close?";
}
eventObject.returnValue = returnValue;
return returnValue;
});
请注意,自Firefox 4以来,消息“你真的要关闭吗?”没有显示。 FF只显示一般消息。请参阅https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
中的注释答案 3 :(得分:10)
window.onbeforeunload = function () {
return "Do you really want to close?";
};
答案 4 :(得分:4)
对于与Telerik(例如:RadComboBox)和DevExpress等第三方控件一起运行良好的解决方案,出于各种原因使用Anchor标签,请考虑使用以下代码,这是一个稍微调整过的desm代码版本自我定位锚标记的选择器:
var inFormOrLink;
$('a[href]:not([target]), a[href][target=_self]').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind('beforeunload', function(eventObject) {
var returnValue = undefined;
if (! inFormOrLink) {
returnValue = "Do you really want to close?";
}
eventObject.returnValue = returnValue;
return returnValue;
});
答案 5 :(得分:3)
我使用了Slaks的答案,但由于onbeforeunload returnValue被解析为字符串然后显示在浏览器的确认框中,因此它不能正常工作。因此显示值true,如" true"。
只是使用返回工作。 这是我的代码
var preventUnloadPrompt;
var messageBeforeUnload = "my message here - Are you sure you want to leave this page?";
//var redirectAfterPrompt = "http://www.google.co.in";
$('a').live('click', function() { preventUnloadPrompt = true; });
$('form').live('submit', function() { preventUnloadPrompt = true; });
$(window).bind("beforeunload", function(e) {
var rval;
if(preventUnloadPrompt) {
return;
} else {
//location.replace(redirectAfterPrompt);
return messageBeforeUnload;
}
return rval;
})
答案 6 :(得分:3)
我的回答是为了提供简单的基准测试。
请参阅@SLaks answer。
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
每当用户关闭页面( x 按钮或 CTRL + W )时,浏览器将执行给定的beforeunload
代码,但不是无限期的。唯一的例外是确认框(return 'Do you really want to close?
),它将一直等到用户的回复。
Chrome :2秒
Firefox :∞(或双击,或强制关闭)
边缘:∞(或双击)
资源管理器11 :0秒
Safari : TODO
我们过去常常对此进行测试:
它的作用是在浏览器关闭其页面之前发送尽可能多的请求(同步)。
<html>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script>
function request() {
return $.ajax({
type: "GET",
url: "http://localhost:3030/" + Date.now(),
async: true
}).responseText;
}
window.onbeforeunload = () => {
while (true) {
request();
}
return null;
}
</script>
</body>
</html>
Chrome输出:
GET /1480451321041 404 0.389 ms - 32
GET /1480451321052 404 0.219 ms - 32
...
GET /hello/1480451322998 404 0.328 ms - 32
1957ms ≈ 2 seconds // we assume it's 2 seconds since requests can take few milliseconds to be sent.
答案 7 :(得分:1)
也许您可以处理OnSubmit并设置一个标志,稍后您可以在OnBeforeUnload处理程序中进行检查。
答案 8 :(得分:1)
-r-
答案 9 :(得分:1)
不幸的是,无论是重新加载,新页面重定向还是浏览器关闭事件都将被触发。另一种方法是捕获触发事件的id,如果是形式,则不触发任何函数,如果它不是表单的id,则在页面关闭时执行您想要执行的操作。我不确定这是否也可以直接进行,而且很乏味。
在客户关闭标签之前,您可以做一些小事。 javascript detect browser close tab/close browser但是如果您的操作列表很大并且标签在完成之前关闭,那么您将无能为力。你可以尝试一下,但根据我的经验,不要依赖它。
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
/* Do you small action code here */
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});
答案 10 :(得分:0)
我的问题:只有在提交奇数(点击次数)时才会触发'onbeforeunload'事件。我在SO中使用了来自类似线程的解决方案,以使我的解决方案有效。我的代码会发言。
<!--The definition of event and initializing the trigger flag--->
$(document).ready(function() {
updatefgallowPrompt(true);
window.onbeforeunload = WarnUser;
}
function WarnUser() {
var allowPrompt = getfgallowPrompt();
if(allowPrompt) {
saveIndexedDataAlert();
return null;
} else {
updatefgallowPrompt(true);
event.stopPropagation
}
}
<!--The method responsible for deciding weather the unload event is triggered from submit or not--->
function saveIndexedDataAlert() {
var allowPrompt = getfgallowPrompt();
var lenIndexedDocs = parseInt($('#sortable3 > li').size()) + parseInt($('#sortable3 > ul').size());
if(allowPrompt && $.trim(lenIndexedDocs) > 0) {
event.returnValue = "Your message";
} else {
event.returnValue = " ";
updatefgallowPrompt(true);
}
}
<!---Function responsible to reset the trigger flag---->
$(document).click(function(event) {
$('a').live('click', function() { updatefgallowPrompt(false); });
});
<!--getter and setter for the flag---->
function updatefgallowPrompt (allowPrompt){ //exit msg dfds
$('body').data('allowPrompt', allowPrompt);
}
function getfgallowPrompt(){
return $('body').data('allowPrompt');
}
答案 11 :(得分:0)
从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序。旧版jQuery的用户应该使用.delegate()而不是.live()
$(window).bind("beforeunload", function() {
return true || confirm("Do you really want to close?");
});
完成或链接
$(window).unbind();
答案 12 :(得分:0)
如果您的表单提交将它们带到另一个页面(因为我认为它会触发beforeunload
),您可以尝试将表单提交更改为ajax调用。这样,他们在提交表单时就不会离开您的页面,您可以根据需要使用beforeunload
绑定代码。
答案 13 :(得分:0)
试试这个
window.onbeforeunload = function ()
{
if (pasteEditorChange) {
var btn = confirm('Do You Want to Save the Changess?');
if(btn === true ){
SavetoEdit();//your function call
}
else{
windowClose();//your function call
}
} else {
windowClose();//your function call
}
};
答案 14 :(得分:-1)
只需验证......
function wopen_close(){
var w = window.open($url, '_blank', 'width=600, height=400, scrollbars=no, status=no, resizable=no, screenx=0, screeny=0');
w.onunload = function(){
if (window.closed) {
alert("window closed");
}else{
alert("just refreshed");
}
}
}
答案 15 :(得分:-1)
var validNavigation = false;
jQuery(document).ready(function () {
wireUpEvents();
});
function endSession() {
// Browser or broswer tab is closed
// Do sth here ...
alert("bye");
}
function wireUpEvents() {
/*
* For a list of events that triggers onbeforeunload on IE
* check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
*/
window.onbeforeunload = function () {
debugger
if (!validNavigation) {
endSession();
}
}
// Attach the event keypress to exclude the F5 refresh
$(document).bind('keypress', function (e) {
debugger
if (e.keyCode == 116) {
validNavigation = true;
}
});
// Attach the event click for all links in the page
$("a").bind("click", function () {
debugger
validNavigation = true;
});
// Attach the event submit for all forms in the page
$("form").bind("submit", function () {
debugger
validNavigation = true;
});
// Attach the event click for all inputs in the page
$("input[type=submit]").bind("click", function () {
debugger
validNavigation = true;
});
}`enter code here`
答案 16 :(得分:-7)
以下为我工作;
$(window).unload(function(event) {
if(event.clientY < 0) {
//do whatever you want when closing the window..
}
});