มีรหัส JavaScript / jQuery ข้ามเบราว์เซอร์ใด ๆ เพื่อตรวจสอบว่าเบราว์เซอร์หรือแท็บเบราว์เซอร์กำลังถูกปิด แต่ไม่ใช่เพราะมีการคลิกลิงค์หรือไม่
sessionStorage
คุณสมบัติมันจะหมดอายุเมื่อเบราว์เซอร์ปิด w3schools.com/jsref/prop_win_sessionstorage.asp
มีรหัส JavaScript / jQuery ข้ามเบราว์เซอร์ใด ๆ เพื่อตรวจสอบว่าเบราว์เซอร์หรือแท็บเบราว์เซอร์กำลังถูกปิด แต่ไม่ใช่เพราะมีการคลิกลิงค์หรือไม่
sessionStorage
คุณสมบัติมันจะหมดอายุเมื่อเบราว์เซอร์ปิด w3schools.com/jsref/prop_win_sessionstorage.asp
คำตอบ:
ถ้าฉันทำให้คุณถูกต้องคุณต้องรู้เมื่อปิดแท็บ / หน้าต่างอย่างมีประสิทธิภาพ AFAIK เป็นวิธีเดียวที่Javascript
จะตรวจจับสิ่งของประเภทนั้นonunload
&onbeforeunload
เหตุการณ์ต่าง ๆ
น่าเสียดายที่ (หรือโชคดี?) เหตุการณ์เหล่านั้นก็เกิดขึ้นเมื่อคุณออกจากเว็บไซต์ผ่านlink
ปุ่มย้อนกลับหรือเบราว์เซอร์ของคุณ ดังนั้นนี่คือคำตอบที่ดีที่สุดที่ฉันสามารถให้ได้ฉันไม่คิดว่าคุณสามารถตรวจจับความบริสุทธิ์close
ใน Javascript ได้ แก้ไขฉันถ้าฉันผิดที่นี่
String
onbeforeunload
ดังนั้นตอนนี้คุณจะไม่สามารถแสดงข้อความที่กำหนดเองได้อีกต่อไปก่อนที่จะยกเลิกการโหลด
unload
ใด
ด้วยเหตุผลบางอย่างเบราว์เซอร์ที่ใช้ Webkit จะไม่ทำตามข้อกำหนดสำหรับกล่องโต้ตอบ ตัวอย่างที่ข้ามการทำงานเกือบจะใกล้เคียงจากตัวอย่างด้านล่าง
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "\o/";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
return confirmationMessage; //Webkit, Safari, Chrome
});
ตัวอย่างนี้สำหรับการจัดการเบราว์เซอร์ทั้งหมด
ทางออกที่ง่าย
window.onbeforeunload = function () {
return "Do you really want to close?";
};
<body onbeforeunload="ConfirmClose()" onunload="HandleOnClose()">
var myclose = false;
function ConfirmClose()
{
if (event.clientY < 0)
{
event.returnValue = 'You have closed the browser. Do you want to logout from your application?';
setTimeout('myclose=false',10);
myclose=true;
}
}
function HandleOnClose()
{
if (myclose==true)
{
//the url of your logout page which invalidate session on logout
location.replace('/contextpath/j_spring_security_logout') ;
}
}
// นี่ใช้งานได้ใน IE7 หากคุณปิดแท็บหรือเบราว์เซอร์ด้วยแท็บเดียวเท่านั้น
window.onunload = "alert('wait')"
และwindow.onbeforeunload = "alert('wait... chrome!')"
ใช้คอนโซลใน Chromium / Ubuntu แต่ไม่ยิงเมื่อฉันปิดแท็บ
window.onunload = "alert('wait')"
และเช่นนั้นไม่ควรใช้งานได้จริง "ฟังก์ชั่นควรกำหนดค่าสตริงให้กับคุณสมบัติ returnValue ของวัตถุเหตุการณ์และส่งคืนสตริงเดียวกัน" โปรดดูบทความ MDN
ฉันต้องออกจากระบบโดยอัตโนมัติเมื่อเบราว์เซอร์หรือแท็บปิด แต่ไม่เมื่อผู้ใช้นำทางไปยังลิงก์อื่น ฉันไม่ต้องการให้แสดงการยืนยันเมื่อเกิดเหตุการณ์เช่นนี้ หลังจากดิ้นรนกับสิ่งนี้มาระยะหนึ่งโดยเฉพาะกับ IE และ Edge นี่คือสิ่งที่ฉันทำ (ตรวจสอบการทำงานกับ IE 11, Edge, Chrome และ Firefox) หลังจากอ้างอิงจากคำตอบนี้
ขั้นแรกให้เริ่มตัวจับเวลานับถอยหลังบนเซิร์ฟเวอร์ในbeforeunload
ตัวจัดการเหตุการณ์ใน JS การโทร ajax จะต้องทำให้ตรงกันสำหรับ IE และ Edge เพื่อให้ทำงานได้อย่างถูกต้อง คุณต้องใช้return;
เพื่อป้องกันไม่ให้กล่องโต้ตอบการยืนยันแสดงเช่นนี้:
window.addEventListener("beforeunload", function (e) {
$.ajax({
type: "POST",
url: startTimerUrl,
async: false
});
return;
});
เริ่มต้นจับเวลาตั้งcancelLogout
ธงเท็จ หากผู้ใช้รีเฟรชหน้าเว็บหรือนำทางเพื่อการเชื่อมโยงภายในอีกcancelLogout
ธงบนเซิร์ฟเวอร์ถูกตั้งค่าให้เป็นจริง เมื่อเหตุการณ์ตัวจับเวลาผ่านไปจะตรวจสอบการcancelLogout
ตั้งค่าสถานะเพื่อดูว่าเหตุการณ์การออกจากระบบถูกยกเลิกหรือไม่ หากตัวจับเวลาถูกยกเลิกก็จะหยุดตัวจับเวลา หากเบราว์เซอร์หรือแท็บปิดอยู่การcancelLogout
ตั้งค่าสถานะจะเป็นเท็จและตัวจัดการเหตุการณ์จะออกจากระบบผู้ใช้
หมายเหตุการใช้งาน: ฉันใช้ ASP.NET MVC 5 และฉันกำลังยกเลิกการออกจากระบบในController.OnActionExecuted()
วิธีการแทนที่
OnActionExecuted
?
ขออภัยฉันไม่สามารถเพิ่มความคิดเห็นให้กับหนึ่งในคำตอบที่มีอยู่ แต่ในกรณีที่คุณต้องการใช้กล่องโต้ตอบคำเตือนฉันต้องการพูดถึงว่าฟังก์ชันตัวจัดการเหตุการณ์ใด ๆ มีอาร์กิวเมนต์ - เหตุการณ์ ในกรณีของคุณคุณสามารถโทร event.preventDefault () เพื่อไม่อนุญาตให้ออกจากหน้าโดยอัตโนมัติจากนั้นออกข้อความโต้ตอบของคุณเอง ฉันคิดว่านี่เป็นตัวเลือกที่ดีกว่าการใช้การแจ้งเตือนมาตรฐานที่น่าเกลียดและไม่ปลอดภัย () ฉันใช้ชุดกล่องโต้ตอบของตัวเองโดยยึดตามวัตถุ kendoWindow (Kendo UI ของ Telerik ซึ่งเกือบเต็มไปด้วยแหล่งที่มายกเว้น kendoGrid และ kendoEditor) คุณยังสามารถใช้กล่องโต้ตอบจาก jQuery UI โปรดทราบว่าสิ่งนั้นเป็นแบบอะซิงโครนัสและคุณจะต้องผูกตัวจัดการกับเหตุการณ์ onclick ของทุกปุ่ม แต่ทั้งหมดนี้ค่อนข้างง่ายที่จะใช้
อย่างไรก็ตามฉันยอมรับว่าการขาดเหตุการณ์ปิดจริงนั้นแย่มาก: ตัวอย่างเช่นหากคุณต้องการรีเซ็ตสถานะเซสชันของคุณที่ส่วนหลังเฉพาะในกรณีที่ใกล้เคียงจริงมันเป็นปัญหา
สำหรับงานที่คล้ายกันคุณสามารถใช้ sessionStorage
เพื่อเก็บข้อมูลไว้ในเครื่องได้จนกว่าจะปิดแท็บเบราว์เซอร์
sessionStorage
เก็บข้อมูลวัตถุเพียงหนึ่งครั้ง (ข้อมูลจะถูกลบเมื่อเบราว์เซอร์แท็บปิด). ( W3Schools )
<div id="Notice">
<span title="remove this until browser tab is closed"><u>dismiss</u>.</span>
</div>
<script>
$("#Notice").click(function() {
//set sessionStorage on click
sessionStorage.setItem("dismissNotice", "Hello");
$("#Notice").remove();
});
if (sessionStorage.getItem("dismissNotice"))
//When sessionStorage is set Do stuff...
$("#Notice").remove();
</script>
ไม่มีเหตุการณ์ แต่มีคุณสมบัติwindow.closed
ที่ได้รับการสนับสนุนในเบราว์เซอร์หลักทั้งหมด ณ เวลาที่เขียนนี้ ดังนั้นหากคุณต้องการรู้ว่าคุณสามารถสำรวจหน้าต่างเพื่อตรวจสอบคุณสมบัตินั้น
if(myWindow.closed){do things}
หมายเหตุ: การสำรวจความคิดเห็นโดยทั่วไปไม่ใช่วิธีที่ดีที่สุด window.onbeforeunload
เหตุการณ์ควรจะใช้ถ้าเป็นไปได้ข้อแม้เพียงอย่างเดียวว่ามันก็ยังยิงไปหากคุณออก
$(window).unload( function () { alert("Bye now!"); } );
beforeunload
ถ้าต้องการที่จะแสดงการแจ้งเตือน เช่นนี้:$(window).on('beforeunload', function(){ alert ('Bye now')});
ลองใช้:
window.onbeforeunload = function (event) {
var message = 'Important: Please click on \'Save\' button to leave this page.';
if (typeof event == 'undefined') {
event = window.event;
}
if (event) {
event.returnValue = message;
}
return message;
};
$(function () {
$("a").not('#lnkLogOut').click(function () {
window.onbeforeunload = null;
});
$(".btn").click(function () {
window.onbeforeunload = null;
});
});
ฉันพบวิธีที่ใช้กับเบราว์เซอร์ของฉันทั้งหมด
ทดสอบกับรุ่นต่อไปนี้: Firefox 57, Internet Explorer 11, Edge 41 ซึ่งเป็นหนึ่งใน Chrome ล่าสุด (จะไม่แสดงรุ่นของฉัน)
หมายเหตุ : โหลดก่อนโหลดถ้าคุณออกจากหน้าในทางที่เป็นไปได้ (รีเฟรชปิดเบราว์เซอร์เปลี่ยนเส้นทางลิงค์ส่ง .. ) หากคุณต้องการให้มันเกิดขึ้นเมื่อปิดเบราว์เซอร์เพียงผูกตัวจัดการเหตุการณ์
$(document).ready(function(){
var validNavigation = false;
// Attach the event keypress to exclude the F5 refresh (includes normal refresh)
$(document).bind('keypress', function(e) {
if (e.keyCode == 116){
validNavigation = true;
}
});
// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});
// Attach the event submit for all forms in the page
$("form").bind("submit", function() {
validNavigation = true;
});
// Attach the event click for all inputs in the page
$("input[type=submit]").bind("click", function() {
validNavigation = true;
});
window.onbeforeunload = function() {
if (!validNavigation) {
// -------> code comes here
}
};
});
เนื่องจากยังไม่มีใครพูดถึง (8 ปีขึ้นไป): WebSocket สามารถเป็นอีกวิธีหนึ่งที่มีประสิทธิภาพในการตรวจสอบแท็บปิด ตราบใดที่แท็บเปิดอยู่และชี้ไปที่โฮสต์ไคลเอ็นต์จะสามารถรักษาการเชื่อมต่อ WebSocket ที่ใช้งานอยู่กับโฮสต์ได้
ข้อแม้: โปรดทราบว่าวิธีการแก้ปัญหานี้เป็นจริงได้เฉพาะสำหรับโครงการถ้า WebSocket ไม่ต้องการค่าใช้จ่ายเพิ่มเติมที่สำคัญจากสิ่งที่คุณทำอยู่แล้ว
ภายในช่วงเวลาหมดเวลาที่เหมาะสม (เช่น 2 นาที) ฝั่งเซิร์ฟเวอร์สามารถกำหนดได้ว่าไคลเอ็นต์จะหายไปหลังจากที่ WebSocket ยกเลิกการเชื่อมต่อและดำเนินการสิ่งที่ต้องการเช่นลบไฟล์ชั่วคราวที่อัปโหลด (ในกรณีที่ใช้อย่างพิเศษของฉันเป้าหมายของฉันคือการยุติเซิร์ฟเวอร์แอปในพื้นที่สามวินาทีหลังจากการเชื่อมต่อ WebSocket ลดลงและกิจกรรม CGI / FastCGI ทั้งหมดสิ้นสุดลงการเชื่อมต่อแบบ keep-alive อื่น ๆ จะไม่ส่งผลกระทบต่อฉัน)
ฉันมีปัญหาในการทำให้ตัวจัดการเหตุการณ์ onunload ทำงานอย่างถูกต้องกับบีคอน (ตามคำแนะนำของคำตอบนี้ ) การปิดแท็บไม่ปรากฏขึ้นเพื่อกระตุ้นสัญญาณและเปิดแท็บที่เปิดขึ้นมาในลักษณะที่อาจทำให้เกิดปัญหา WebSocket แก้ไขปัญหาที่ฉันเรียกใช้อย่างหมดจดมากขึ้นเนื่องจากการเชื่อมต่อจะปิดลงในเวลาเดียวกับที่แท็บปิดและสลับหน้าเว็บภายในแอปพลิเคชันเพียงแค่เปิดการเชื่อมต่อ WebSocket ใหม่ภายในหน้าต่างหน่วงเวลา
//Detect Browser or Tab Close Events
$(window).on('beforeunload',function(e) {
e = e || window.event;
var localStorageTime = localStorage.getItem('storagetime')
if(localStorageTime!=null && localStorageTime!=undefined){
var currentTime = new Date().getTime(),
timeDifference = currentTime - localStorageTime;
if(timeDifference<25){//Browser Closed
localStorage.removeItem('storagetime');
}else{//Browser Tab Closed
localStorage.setItem('storagetime',new Date().getTime());
}
}else{
localStorage.setItem('storagetime',new Date().getTime());
}
});
สวัสดีทุกคนฉันสามารถบรรลุ 'คลิกตรวจหาเบราว์เซอร์และแท็บปิดเหตุการณ์' โดยใช้ที่จัดเก็บในตัวเครื่องและเวลาประทับของเบราว์เซอร์ หวังว่าพวกคุณทุกคนจะได้รับการแก้ไขปัญหาของคุณโดยใช้วิธีนี้
หลังจากการวิจัยครั้งแรกของฉันฉันพบว่าเมื่อเราปิดเบราว์เซอร์เบราว์เซอร์จะปิดแท็บทั้งหมดทีละตัวเพื่อปิดเบราว์เซอร์อย่างสมบูรณ์ ดังนั้นฉันสังเกตว่าจะมีการหน่วงเวลาน้อยมากระหว่างการปิดแท็บ ดังนั้นฉันจึงใช้เวลาหน่วงเวลานี้เป็นจุดตรวจสอบหลักของฉันและสามารถบรรลุการตรวจจับเหตุการณ์เบราว์เซอร์และแท็บได้
ฉันทดสอบบน Chrome Browser เวอร์ชัน 76.0.3809.132 และพบว่าใช้งานได้
:) โหวตถ้าคุณคิดว่าคำตอบของฉันมีประโยชน์ ....
window.onbeforeunload = function() {
console.log('event');
return false; //here also can be string, that will be shown to the user
}
here also can be string, that will be shown to the user
มันไม่ได้เกี่ยวกับ Firefox มันจะอยู่ในโครเมี่ยม แต่ ...
เป็นไปได้ที่จะตรวจสอบด้วยความช่วยเหลือของ window.closed ในตัวจัดการเหตุการณ์ในเหตุการณ์ 'unload' เช่นนี้ แต่จำเป็นต้องใช้การหมดเวลา (ดังนั้นผลลัพธ์ไม่สามารถรับประกันได้หาก smth ล่าช้าหรือป้องกันหน้าต่างปิด):
ตัวอย่างของ JSFiddle (ทดสอบเมื่อ lates Safari, FF, Chrome, Edge และ IE11)
var win = window.open('', '', 'width=200,height=50,left=200,top=50');
win.document.write(`<html>
<head><title>CHILD WINDOW/TAB</title></head>
<body><h2>CHILD WINDOW/TAB</h2></body>
</html>`);
win.addEventListener('load',() => {
document.querySelector('.status').innerHTML += '<p>Child was loaded!</p>';
});
win.addEventListener('unload',() => {
document.querySelector('.status').innerHTML += '<p>Child was unloaded!</p>';
setTimeout(()=>{
document.querySelector('.status').innerHTML += getChildWindowStatus();
},1000);
});
win.document.close()
document.querySelector('.check-child-window').onclick = ()=> {
alert(getChildWindowStatus());
}
function getChildWindowStatus() {
if (win.closed) {
return 'Child window has been closed!';
} else {
return 'Child window has not been closed!';
}
}
ฉันได้ลองใช้วิธีแก้ปัญหาข้างต้นทั้งหมดแล้วมันไม่ได้ผลเลยสำหรับฉันเป็นพิเศษเพราะมีส่วนประกอบ Telerik ในโครงการของฉันที่มีปุ่ม 'ปิด' สำหรับหน้าต่างป๊อปอัปและเรียกว่าเหตุการณ์ 'ก่อนโหลด' นอกจากนี้ตัวเลือกปุ่มทำงานไม่ถูกต้องเมื่อคุณมีกริด Telerik ในหน้าของคุณ (ฉันหมายถึงปุ่มที่อยู่ภายในกริด) ดังนั้นฉันจึงไม่สามารถใช้คำแนะนำใด ๆ ข้างต้นได้ ในที่สุดนี่คือทางออกสำหรับฉัน ฉันได้เพิ่มเหตุการณ์ onUnload บนแท็ก body ของ _Layout.cshtml บางสิ่งเช่นนี้
<body onUnload="LogOff()">
แล้วเพิ่มฟังก์ชัน LogOff เพื่อเปลี่ยนเส้นทางไปยังบัญชี / LogOff ซึ่งเป็นวิธีการในตัวใน Asp.Net MVC ตอนนี้เมื่อฉันปิดเบราว์เซอร์หรือแท็บก็เปลี่ยนเส้นทางไปยังวิธี LogOff และผู้ใช้จะต้องเข้าสู่ระบบเมื่อกลับมา ฉันได้ทำการทดสอบแล้วทั้งใน Chrome และ Firefox และมันใช้งานได้!
function LogOff() {
$.ajax({
url: "/Account/LogOff",
success: function (result) {
}
});
}
window.onbeforeunload = function ()
{
if (isProcess > 0)
{
return true;
}
else
{
//do something
}
};
ฟังก์ชั่นนี้แสดงกล่องโต้ตอบการยืนยันถ้าคุณปิดหน้าต่างหรือรีเฟรชหน้าในระหว่างกระบวนการใด ๆ ในเบราว์เซอร์ฟังก์ชั่นนี้ทำงานในทุกเบราว์เซอร์คุณต้องตั้งค่า isProcess var ในกระบวนการ ajax ของคุณ
window.addEventListener("beforeunload", function (e) {
var confirmationMessage = "tab close";
(e || window.event).returnValue = confirmationMessage; //Gecko + IE
sendkeylog(confirmationMessage);
return confirmationMessage; //Webkit, Safari, Chrome etc.
});
sendkeylog
อะไร
ตามที่ @ jAndy พูดถึงไม่มีรหัสจาวาสคริปต์ที่ถูกต้องในการตรวจสอบหน้าต่างที่ถูกปิด ฉันเริ่มจากสิ่งที่ @Syno เสนอมา
ฉันผ่านไปแล้วแม้ว่าสถานการณ์แบบนั้นและให้คุณทำตามขั้นตอนเหล่านี้คุณจะสามารถตรวจจับได้
ฉันทดสอบบน Chrome 67+ และ Firefox 61+
var wrapper = function () { //ignore this
var closing_window = false;
$(window).on('focus', function () {
closing_window = false;
//if the user interacts with the window, then the window is not being
//closed
});
$(window).on('blur', function () {
closing_window = true;
if (!document.hidden) { //when the window is being minimized
closing_window = false;
}
$(window).on('resize', function (e) { //when the window is being maximized
closing_window = false;
});
$(window).off('resize'); //avoid multiple listening
});
$('html').on('mouseleave', function () {
closing_window = true;
//if the user is leaving html, we have more reasons to believe that he's
//leaving or thinking about closing the window
});
$('html').on('mouseenter', function () {
closing_window = false;
//if the user's mouse its on the page, it means you don't need to logout
//them, didn't it?
});
$(document).on('keydown', function (e) {
if (e.keyCode == 91 || e.keyCode == 18) {
closing_window = false; //shortcuts for ALT+TAB and Window key
}
if (e.keyCode == 116 || (e.ctrlKey && e.keyCode == 82)) {
closing_window = false; //shortcuts for F5 and CTRL+F5 and CTRL+R
}
});
// Prevent logout when clicking in a hiperlink
$(document).on("click", "a", function () {
closing_window = false;
});
// Prevent logout when clicking in a button (if these buttons rediret to some page)
$(document).on("click", "button", function () {
closing_window = false;
});
// Prevent logout when submiting
$(document).on("submit", "form", function () {
closing_window = false;
});
// Prevent logout when submiting
$(document).on("click", "input[type=submit]", function () {
closing_window = false;
});
var toDoWhenClosing = function() {
//write a code here likes a user logout, example:
//$.ajax({
// url: '/MyController/MyLogOutAction',
// async: false,
// data: {
// },
// error: function () {
// },
// success: function (data) {
// },
//});
};
window.onbeforeunload = function () {
if (closing_window) {
toDoWhenClosing();
}
};
};
resize
เมื่อหน้าต่างเบลอ ถ้ามันเบลอ 100x คุณจะมีผู้ฟัง 100 คนซึ่งจะทำให้เบราว์เซอร์ช้าลง
ลองสิ่งนี้ฉันมั่นใจว่าจะใช้งานได้กับคุณ
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type='text/javascript'>
$(function() {
try{
opera.setOverrideHistoryNavigationMode('compatible');
history.navigationMode = 'compatible';
}catch(e){}
function ReturnMessage()
{
return "wait";
}
function UnBindWindow()
{
$(window).unbind('beforeunload', ReturnMessage);
}
$(window).bind('beforeunload',ReturnMessage );
});
</script>
ลองสิ่งนี้ มันจะทำงาน. วิธีการยกเลิกการโหลด jquery ถูกยกเลิก
window.onbeforeunload = function(event) {
event.returnValue = "Write something clever here..";
};