[JQUERY] 브라우저 또는 탭 폐쇄 감지
JQUERY브라우저 또는 탭 폐쇄 감지
해결법
-
1.내가 정확하게 당신을 얻을 경우, 당신은 탭 / 창을 효과적으로 닫을 때 알고 싶어요. 음, AFAIK 식료품의 종류를 감지하는 자바 스크립트의 유일한 방법으로 onUnload & onbeforeunload 이벤트입니다.
내가 정확하게 당신을 얻을 경우, 당신은 탭 / 창을 효과적으로 닫을 때 알고 싶어요. 음, AFAIK 식료품의 종류를 감지하는 자바 스크립트의 유일한 방법으로 onUnload & onbeforeunload 이벤트입니다.
당신이 링크를 통해 사이트를 떠나거나 브라우저 버튼을 다시 불행하게도 (또는 다행스럽게도?), 그 이벤트는 해고된다. 이것이 내가 줄 수있는 최선의 대답은 그래서, 난 당신이 기본적으로 자바 스크립트에서 순수한 가까이 감지 할 수 있다고 생각하지 않습니다. 내가 잘못 여기있어 경우에 저를 수정합니다.
-
2.MDN 문서에서
MDN 문서에서
몇 가지 이유를 들어, 웹킷 기반 브라우저는 대화 상자에 대한 사양을 따르지 않습니다. 거의 상호 동작하는 예제는 아래의 예에서 가까운 것이다.
window.addEventListener("beforeunload", function (e) { var confirmationMessage = "\o/"; (e || window.event).returnValue = confirmationMessage; //Gecko + IE return confirmationMessage; //Webkit, Safari, Chrome });
모든 브라우저를 처리하기위한이 예.
-
3.간단한 솔루션
간단한 솔루션
window.onbeforeunload = function () { return "Do you really want to close?"; };
-
4.
<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에서 작업이다
-
5.나는 때 자동으로 브라우저 또는 탭 닫히고 사용자가 로그 아웃 할 필요하지만,하지 않을 경우 다른 링크에 대한 사용자 이동합니다. 나 또한 그렇게되면 프롬프트 확인이 표시 싶지 않았다. 특히 IE와 가장자리로, 잠시 동안 고민 한 후, 여기에 내가이 대답하여 접근 떨어져 내놓고 후 (IE 11, 가장자리, 크롬, 파이어 폭스와 함께 작동 확인)하고 끝난거야.
나는 때 자동으로 브라우저 또는 탭 닫히고 사용자가 로그 아웃 할 필요하지만,하지 않을 경우 다른 링크에 대한 사용자 이동합니다. 나 또한 그렇게되면 프롬프트 확인이 표시 싶지 않았다. 특히 IE와 가장자리로, 잠시 동안 고민 한 후, 여기에 내가이 대답하여 접근 떨어져 내놓고 후 (IE 11, 가장자리, 크롬, 파이어 폭스와 함께 작동 확인)하고 끝난거야.
먼저, JS에서 beforeunload 이벤트 핸들러 서버 카운트 다운 타이머를 시작한다. 아약스 호출은 IE 및 에지 제대로 작동하려면 동기화 할 필요가있다. 또한 사용 반환해야; 이처럼 보여주는에서 확인 대화 상자를 방지하기 위해 :
window.addEventListener("beforeunload", function (e) { $.ajax({ type: "POST", url: startTimerUrl, async: false }); return; });
타이머 세트 false로 cancelLogout 플래그를 시작. 사용자 새로 고침 다른 내부 링크 페이지 나 이동했을 경우, 서버의 cancelLogout 플래그가 true로 설정됩니다. 타이머 이벤트 경과 후에는 로그 아웃 이벤트가 취소되었는지 여부를 확인하기 위해 cancelLogout 플래그를 검사한다. 타이머가 취소 된 경우는 타이머를 정지합니다. 브라우저 또는 탭이 닫힌 경우, cancelLogout 플래그는 거짓 남아있을 것입니다 및 이벤트 핸들러는 사용자가 로그 아웃 할 것입니다.
구현상의주의 : 나는 ASP.NET MVC 5를 사용하고 있는데 내가 재정의 Controller.OnActionExecuted () 메소드에서 로그 아웃을 취소하고있다.
-
6.유사한 작업의 경우, 브라우저 탭을 닫을 때까지 로컬에 데이터를 저장하는 sessionStorage를 사용할 수 있습니다.
유사한 작업의 경우, 브라우저 탭을 닫을 때까지 로컬에 데이터를 저장하는 sessionStorage를 사용할 수 있습니다.
하나의 세션 (브라우저 탭을 닫을 때 데이터가 삭제됩니다)에 대한 sessionStorage 오브젝트 데이터를 저장합니다. (W3 스쿨)
이건 내 펜이야.
<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>
-
7.이벤트 - 미안 해요, 난 기존의 답변 중 하나에 댓글을 추가 할 수 없습니다 만, 경우에 당신이 경고 대화 상자의 종류를 구현하고 싶었, 난 그냥 어떤 이벤트 핸들러 함수 인수를 가지고 언급하고 싶었다. 귀하의 경우에 당신은, 자동으로 페이지를 떠나 허용 자신의 대화를 발행에서는 event.preventDefault ()를 호출 할 수 있습니다. 나는 표준 추한 안전하지 않은 경고를 사용하는 것보다이 방법이 더 나은 옵션을 고려 (). 나는 개인적으로 kendoWindow 객체 기반 대화 상자 내 자신의 세트를 구현 (거의 완벽하다 Telerik의 검도 UI, kendoGrid 및 kendoEditor의 제외, 오픈 소스 화). 또한 jQuery를 UI에서 대화 상자를 사용할 수 있습니다. 제발 참고 그런 일이 비동기, 당신은 모든 버튼의 onclick 이벤트 핸들러를 바인딩해야합니다, 그러나 이것은 아주 쉽게 구현하기 위해 모든 것을,하지만.
이벤트 - 미안 해요, 난 기존의 답변 중 하나에 댓글을 추가 할 수 없습니다 만, 경우에 당신이 경고 대화 상자의 종류를 구현하고 싶었, 난 그냥 어떤 이벤트 핸들러 함수 인수를 가지고 언급하고 싶었다. 귀하의 경우에 당신은, 자동으로 페이지를 떠나 허용 자신의 대화를 발행에서는 event.preventDefault ()를 호출 할 수 있습니다. 나는 표준 추한 안전하지 않은 경고를 사용하는 것보다이 방법이 더 나은 옵션을 고려 (). 나는 개인적으로 kendoWindow 객체 기반 대화 상자 내 자신의 세트를 구현 (거의 완벽하다 Telerik의 검도 UI, kendoGrid 및 kendoEditor의 제외, 오픈 소스 화). 또한 jQuery를 UI에서 대화 상자를 사용할 수 있습니다. 제발 참고 그런 일이 비동기, 당신은 모든 버튼의 onclick 이벤트 핸들러를 바인딩해야합니다, 그러나 이것은 아주 쉽게 구현하기 위해 모든 것을,하지만.
그러나, 나는 할 실제 close 이벤트의 부족 끔찍한 동의 : 당신은, 예를 들어, 단지 실제 가까운 경우에 백 엔드에서 세션 상태를 재설정하려는 경우, 그것이 문제입니다.
-
8.이벤트는 없지만,이 글을 쓰는 시점의 모든 주요 브라우저에서 지원됩니다 window.closed 속성이있다. 당신이 정말로 알 필요가 따라서 경우 해당 속성을 확인하기 위해 창을 폴링 할 수있다.
이벤트는 없지만,이 글을 쓰는 시점의 모든 주요 브라우저에서 지원됩니다 window.closed 속성이있다. 당신이 정말로 알 필요가 따라서 경우 해당 속성을 확인하기 위해 창을 폴링 할 수있다.
경우 (myWindow.closed) {일을}
노트 : 폴링 아무것도 일반적으로 가장 좋은 방법이 아닙니다. 가능하면 window.onbeforeunload 이벤트는 멀리 이동 한 경우에만주의는 또한 화재 있다는 것을 사용해야합니다.
-
9.
$(window).unload( function () { alert("Bye now!"); } );
-
10.나는 나의 모든 브라우저에서 작동하는 방법을 발견했다.
나는 나의 모든 브라우저에서 작동하는 방법을 발견했다.
버전을 다음에서 테스트 : 파이어 폭스 57, 인터넷 익스플로러 11, 에지 (41), 최신 크롬 중 하나 (내 버전이 표시되지 않습니다)
$(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 } }; });
-
11.그것을 사용하려고 :
그것을 사용하려고 :
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; }); });
-
12.아무도 (8+ 년 후) 아직 언급되지 않았기 때문에, • 웹 소켓이 닫힌 탭을 감지하는 또 다른 효과적인 방법이 될 수 있습니다. 만큼 탭이 호스트에서 열려 뾰족으로, 클라이언트는 호스트에 대한 활성 웹 소켓 연결을 유지할 수 있습니다.
아무도 (8+ 년 후) 아직 언급되지 않았기 때문에, • 웹 소켓이 닫힌 탭을 감지하는 또 다른 효과적인 방법이 될 수 있습니다. 만큼 탭이 호스트에서 열려 뾰족으로, 클라이언트는 호스트에 대한 활성 웹 소켓 연결을 유지할 수 있습니다.
주의하십시오 웹 소켓이 이미하고있는 일에서 추가 상당한 오버 헤드를 필요로하지 않는 경우이 솔루션은 정말 프로젝트 만 가능한 것을 바랍니다 참고.
합리적인 제한 시간 (예를 들면, 2- 분) 내에서, 서버 측은 웹 소켓이 분리 된 후, 클라이언트가 사라진 것을 확인할 수 및 업로드 임시 파일을 삭제로서 요구되는 어떤 동작을 수행. (내 매우 전문 사용-경우, 내 목표는 세 초 웹 소켓 연결 방울 모든 CGI / FastCGI를 활동 종료 후 로컬 호스트 애플리케이션 서버를 종료하는 것이 었습니다 -. 다른 연결 유지 연결이 나에게 영향을주지 않습니다)
나는 문제 (이 답변에서 권장하는대로)으로 onUnload 이벤트 핸들러가 비콘 제대로 작동 점점 있었다. 탭을 닫으면 비콘을 트리거 표시하고 열려있는 탭이 방법으로 할 수 잠재적 원인이 문제에 트리거하지 않았다. 웹 소켓 연결이 대략 주변의 응용 프로그램 내에서 탭 닫히고 전환 페이지는 단순히 잘 지연 창에서 새 웹 소켓 연결을 엽니 다 것과 같은 시간을 닫기 때문에 좀 더 깨끗하게으로 실행 된 문제를 해결했다.
-
13.
window.onbeforeunload = function() { console.log('event'); return false; //here also can be string, that will be shown to the user }
-
14.
window.addEventListener("beforeunload", function (e) { var confirmationMessage = "tab close"; (e || window.event).returnValue = confirmationMessage; //Gecko + IE sendkeylog(confirmationMessage); return confirmationMessage; //Webkit, Safari, Chrome etc. });
-
15.
//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()); } });
JSFiddle 링크
모두 안녕하세요, 저는 브라우저 로컬 스토리지와 타임 스탬프를 사용하여 클릭 '브라우저 및 탭 닫기 이벤트 감지'을 달성 할 수 있었다. 여러분 모두가이 솔루션을 사용하여 문제를 해결 얻을 것이다 바랍니다.
나의 초기 연구 후에 나는 우리가 브라우저를 닫을 때, 브라우저가 완전히 닫 브라우저에 의해 모든 탭 하나를 닫습니다 것을 발견했다. 따라서, 난 탭 폐쇄 간의 약간의 시간 지연이있을 수있을 뿐이다는 것을 알았다. 내 주요 검증 포인트로이 시간 지연을 촬영하고 브라우저 및 탭 닫기 이벤트 감지를 달성 할 수 있도록.
나는 크롬 브라우저 버전 76.0.3809.132에 그것을 테스트 작업 발견
: 당신이 내 대답은 도움이되었다고 투표까지하면 ....
-
16.나는 그들 중 누구도 정말 팝업 창에 '닫기'버튼이 내 프로젝트의 일부 Telerik 구성 요소가 특수하기 때문에, 저를 위해 일하지, 위의 모든 솔루션을 시도, 그것은 'beforeunload'이벤트를 호출합니다. 당신이 당신의 페이지에 Telerik 그리드 (격자 내부 I 평균 버튼) 그래서, 제안 위 중 하나를 사용할 수없는이있을 때 또한, 버튼 선택이 제대로 작동하지 않습니다. 마지막으로이 나를 위해 일한 솔루션입니다. 나는 _Layout.cshtml의 body 태그에으로 onUnload 이벤트를 추가했습니다. 이 같은:
나는 그들 중 누구도 정말 팝업 창에 '닫기'버튼이 내 프로젝트의 일부 Telerik 구성 요소가 특수하기 때문에, 저를 위해 일하지, 위의 모든 솔루션을 시도, 그것은 'beforeunload'이벤트를 호출합니다. 당신이 당신의 페이지에 Telerik 그리드 (격자 내부 I 평균 버튼) 그래서, 제안 위 중 하나를 사용할 수없는이있을 때 또한, 버튼 선택이 제대로 작동하지 않습니다. 마지막으로이 나를 위해 일한 솔루션입니다. 나는 _Layout.cshtml의 body 태그에으로 onUnload 이벤트를 추가했습니다. 이 같은:
<body onUnload="LogOff()">
다음입니다 계정 / 로그 오프로 리디렉션 로그 오프 기능을 추가 내장 Asp.Net MVC의 방법. 나는 브라우저 또는 탭을 닫으면, 그것은 반환 할 때 로그인에 로그 오프 방법과 사용자에게 있습니다 리디렉션합니다. 나는 크롬 및 파이어 폭스 모두를 테스트했습니다. 그리고 그것은 작동한다!
function LogOff() { $.ajax({ url: "/Account/LogOff", success: function (result) { } }); }
-
17.
window.onbeforeunload = function () { if (isProcess > 0) { return true; } else { //do something } };
모든 browsers.You에서 browser.This 기능 작업의 모든 과정을 진행하는 동안 창 닫기 또는 새로 고침 페이지가 아약스 과정에서 설정 isProcess의 VAR에있는 경우이 함수는 확인 대화 상자를 표시합니다.
-
18.이 같은 '언로드'이벤트에 대한 이벤트 처리기에서 window.closed의 도움으로 그것을 확인하는 것이 가능하지만 (결과가 떨어지게 지연하는 경우 보증 또는 폐쇄에서 창을 방지 할 수 있도록) 시간 초과 사용이 필요합니다 :
이 같은 '언로드'이벤트에 대한 이벤트 처리기에서 window.closed의 도움으로 그것을 확인하는 것이 가능하지만 (결과가 떨어지게 지연하는 경우 보증 또는 폐쇄에서 창을 방지 할 수 있도록) 시간 초과 사용이 필요합니다 :
JSFiddle의 예는 (lates을 사파리, FF, 크롬, 에지 및 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!'; } }
-
19.@jAndy가 언급 한 바와 같이, 윈도우 존재가 폐쇄 감지하는 자바 스크립트 코드는 더 제대로 없다. 나는 @Syno 제안했던 것에서 시작했다.
@jAndy가 언급 한 바와 같이, 윈도우 존재가 폐쇄 감지하는 자바 스크립트 코드는 더 제대로 없다. 나는 @Syno 제안했던 것에서 시작했다.
그 같은 상황을 통해 패스를했고, 당신은 당신이 그것을 감지 할 수 있습니다 다음과 같이 제공했다. 나는 크롬 67+와 파이어 폭스에서 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(); } };
};
-
20.이 시도, 나는이 당신을 위해 작동 확신합니다.
이 시도, 나는이 당신을 위해 작동 확신합니다.
<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>
-
21.이 시도. 그것은 작동합니다. JQuery와 언로드 방법은 depreceted된다.
이 시도. 그것은 작동합니다. JQuery와 언로드 방법은 depreceted된다.
window.onbeforeunload = function(event) { event.returnValue = "Write something clever here.."; };
from https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing by cc-by-sa and MIT license
'JQUERY' 카테고리의 다른 글
[JQUERY] jQuery를 모바일 : 문서 준비 대 페이지 이벤트 (0) | 2020.09.21 |
---|---|
[JQUERY] 동적으로 생성 된 요소에 작동하지 않는 이벤트를 클릭 [중복] (0) | 2020.09.21 |
[JQUERY] 나는 같은 페이지에 jQuery를 여러 버전을 사용할 수 있습니까? (0) | 2020.09.21 |
[JQUERY] .ready $ (문서) VS 위해 window.onload () (0) | 2020.09.21 |
[JQUERY] catch되지 않은 ReferenceError가 : $ 정의되지 않는 이유는 무엇입니까? (0) | 2020.09.21 |